PHP中对象的克隆
浅克隆
只能克隆对象中的“非对象非资源”的数据
class A{
public $o = 1;
}
$obj = new A();
$obj1 = clone $obj;
$obj->o = 2;
var_dump($obj);
echo '<br />';
var_dump($obj1);
输出结果如下图
可以看出对象的值修改后,克隆出来的对象值没有改变。
如果对象中的属性存储的是“对象”类型,则就可以看到克隆不完全的情形,如下:
class B{
public $b = 2;
}
class A{
public $a = 1;
public $c;
function __construct(){
$this->c = new B(); // 此时c中存储的是对象
}
}
$obj = new A();
$obj1 = clone $obj;
$obj->a = 10;
$obj->c->b = 12;
var_dump($obj);
echo "<br />";
var_dump($obj1);
输出结果如下:
此时我们可以看到,修改了obj中c的值发现obj1的c的值也跟着变了,这就是克隆不完全。
深克隆
深克隆:一个对象的所有属性数据都彻底实现了“复制”
在PHP中默认是浅克隆,要想实现深克隆,就需要对该类对象使用魔术方法__clone(),并在里面实现深度克隆。改进刚才代码如下:
class B{
public $b = 2;
}
class A{
public $a = 1;
public $c;
function __construct(){
$this->c = new B(); // 此时c中存储的是对象
}
function __clone(){
$this->c = clone $this->c; // 此方法会在对象克隆时调用
}
}
$obj = new A();
$obj1 = clone $obj;
$obj->a = 10;
$obj->c->b = 12;
var_dump($obj);
echo "<br />";
var_dump($obj1);