四、对象复制
在 PHP 开发中经常会遇到, 对象复制问题. 通过下面代码深入理解一下, PHP 的对象复制.
class Student
{
public $username = 'zZ爱吃菜';
public $age = 29;
public $weight = 72;
public $obj = null;
}
$a = new Student();
$b = $a;
$b->age = 18;
var_dump($a->age);
// 输出结果: int(18)
是不是很奇怪, 明明修改了 $b->age
结果 $a->age
值也变成 18 了.
PHP 变量复制的方式有两种: 浅拷贝 和 深拷贝
- 浅拷贝: 省内存
- 深拷贝: 消耗内存,但变量相对独立,不会因为状态变化,不好维护.
所以不同场景要活用 深拷贝与浅拷贝.
在 PHP 中,对象类型的复制是浅拷贝的.其他普通类型复制是深拷贝.
1. 浅拷贝(地址传递)
解释: 变量赋值时, 只是传递了当前对象存储的内存地址,即 2个或多个对象指向的是同一个内存地址.(对象只有一个).
所以上面代码就说的同了 $a 和 $b 指向的是同一个内存地址,其中存储的是 Student 的实例, 当 $b->age = 18;
时, 也会影响到 $a 对应的值啦.
对象赋值进行深拷贝
clone 关键字, 可以实现将 对象复制的浅拷贝变为深拷贝
class Student
{
public $username = 'zZ爱吃菜';
public $age = 29;
public $weight = 72;
public $obj = null;
}
$a = new Student();
$b = clone $a;
$b->age = 18;
var_dump($a->age);
// 输出结果: int(29)
2. 深拷贝(值传递)
解释: 变量赋值, 开辟一个内存空间,重新复制一个值,赋值给新的变量.
← 三、魔术方法