对象复制
在多数情况下,我们并不需要完全复制一个对象来获得其中属性。但有一个情况下确实需要:如果你有一个
GTK窗口对象,该对象持有窗口相关的资源。你可能会想复制一个新的窗口,保持所有属性与原来的窗口相同,
但必须是一个新的对象(因为如果不是新的对象,那么一个窗口中的改变就会影响到另一个窗口)。还有一种情况:
如果对象A中保存着对象B的引用,当你复制对象A时,你想其中使用的对象不再是对象B而是B的一个副本,那么
你必须得到对象A的一个副本。
对象复制可以通过clone关键字来完成(如果对象中存在__clone()方法,会先被调用)。对象中的
__clone()方法不能直接调用。
$copy_of_object = clone $object;
当对象被复制后,PHP5会对对象的所有属性执行一个“浅复制”(shallow copy)。所有的属性中的引用
仍然不变,指向原来的变量。如果定义了__clone()方法,则新创建的对象(复制生成的对象)中的__clone()方法会被调用,
可用于修改属性的值(如果有必要的话)。
Example #1 复制一个对象
static$instances=0;
public$instance;
public function__construct() {$this->instance= ++self::$instances;
}
public function__clone() {$this->instance= ++self::$instances;
}
}
classMyCloneable{
public$object1;
public$object2;
function__clone()
{// 强制复制一份this->object, 否则仍然指向同一个对象$this->object1= clone$this->object1;
}
}$obj= newMyCloneable();$obj->object1= newSubObject();$obj->object2= newSubObject();$obj2= clone$obj;
print("Original Object:
");print_r($obj);
print("Cloned Object:
");print_r($obj2);?>
以上例程会输出:
Original Object:
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] => 1
)
[object2] => SubObject Object
(
[instance] => 2
)
)
Cloned Object:
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] => 3
)
[object2] => SubObject Object
(
[instance] => 2
)
)