PHP 对象克隆(浅拷贝和深拷贝)
1. 对象是通过引用传递的
class My_class{
private $color;
}
$obj = new My_class;
$obj->color = 'red';
$obj2 = $obj;
$obj2->color = 'blue';
echo $obj->color . "\n";
echo $obj2->color;
//输出
// blue
// blue
2. 同过 clone 克隆对象是浅拷贝
class My_class{
private $color;
}
$obj = new My_class;
$obj1= clone($obj);
$obj->color = 'red';
$obj1->color = 'blue';
echo $obj->color . "\n";
echo $obj1->color;
//输出:
// red
// blue
3. 通过 __clone 深拷贝复制对象
使用 clone 克隆对象,对象指向的是两个不同的地址,
但是如果对象里面有成员变量是引用的话
那么在其中一个对象修改这个引用变量,都是改变他的值
比如 PHP 类里面依赖注入的时候,很多 private 的对象
a) 普通情况
class My_class{
private $color;
}
$color = 'red';
$obj1 = new My_class();
$obj1->color = &$color;
$obj2 = clone obj1;
$obj2->color = 'blue';
echo $obj1->color . "\n";
echo $obj2->color;
// 结果
// blue
// blue
b) 使用深拷贝
class My_class{
private $color;
public function __clone(){
$this->color = clone $this->color;
}
}
$color = 'red';
$obj1 = new My_class();
$obj1->color = &$color;
$obj2 = clone obj1;
$obj2->color = 'blue';
echo $obj1->color . "\n";
echo $obj2->color;
// 结果
// red
// blue