分享PHP手册上 关于对象克隆的例子
<?php class SubObject { static $instances = 0; public $instance; public function __construct() { $this->instance = ++self::$instances; } public function __clone() { $this->instance = ++self::$instances; } } class MyCloneable { public $object1; public $object2; function __clone() { // 强制复制一份this->object, 否则仍然指向同一个对象 $this->object1 = clone $this->object1; } } $obj = new MyCloneable(); //第一步 $obj->object1 = new SubObject(); //第二步 $obj->object2 = new SubObject(); $obj2 = clone $obj; //第三步 print_r($obj); print_r($obj2);第一步:
$obj = new MyCloneable();
这里$obj是MyCloneable的对象
MyCloneable Object ( [object1] => [object2] => )
第二步:
$obj->object1 = new SubObject(); $obj->object2 = new SubObject();
这里是对MyCloneable对象进行赋值,将SubObject的对象分别赋给MyCloneable的object1,object2属性
MyCloneable Object ( [object1] => SubObject Object ( [instance] => 1 )
[object2] => SubObject Object ( [instance] => 2 )
)
第三步:
$obj2 = clone $obj;
将MyCloneable的对象$obj克隆产生obj2,克隆完成后,
首先调用MyCloneable的__clone()方法,这个方法会再次克隆obj2的object1属性(该属性值是SubObject的对象)
继而调用SubObject的__clone()方法,使得instance值加1,也就是obj2的object1属性加1变成3。
print_r($obj);
MyCloneable Object ( [object1] => SubObject Object ( [instance] => 1 ) [object2] => SubObject Object ( [instance] => 2 ) )print_r($obj2);
MyCloneable Object ( [object1] => SubObject Object ( [instance] => 3 ) [object2] => SubObject Object ( [instance] => 2 ) )