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