分享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
)
)