php clone 对象克隆

mac2025-03-26  13

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

 

最新回复(0)