php中对象的复制很高效 在多数情况下,我们并不需要完全复制一个对象来获得其中属性。但有一个情况下确实需要:如果你有一个 GTK窗口对象,该对象持有窗口相关的资源。你可能会想复制一个新的窗口,保持所有属性与原来的窗口相同, 但必须是一个新的对象(因为如果不是新的对象,那么一个窗口中的改变就会影响到另一个窗口)。还有一种情况: 如果对象A中保存着对象B的引用,当你复制对象A时,你想其中使用的对象不再是对象B而是B的一个副本,那么 你必须得到对象A的一个副本。
$copy_of_object = clone$object;//$object和$copy_of_object是不同的对象,不过$copy_of_object的值是在$object基础加$object事例对象里clone()方法改变后的实例
当对象被复制后,PHP5会对对象的所有属性执行一个“浅复制”(shallow copy)。所有的属性中的引用仍然不变,指向原来的变量。如果定义了__clone()方法,则新创建的对象(复制生成的对象)中的__clone()方法会被调用,可用于修改属性的值(如果有必要的话)。
核心:
$obj = new MyCloneable();
//调用MyCloneable::__clone方法。clone方法重置想改变项,返回修改后的类的实例给pbj2.
<?php
class SubObject
{
}
class MyCloneable
{
}
$obj = new MyCloneable();
echo '!!!1111!!!<br>';
$obj->object1 = new SubObject();
$obj->object2 = new SubObject();
$obj2 = clone$obj;//调用MyCloneable::__clone方法。clone方法重置想改变项,返回修改后的类的实例给pbj2.
print("原对象:\n");
var_dump($obj);
echo'<br><br><br>';
print("Cloned 对象:\n");
var_dump($obj2);
###################结果###################
~~~~__construct OA~~~~
!!!1111!!!
~~~~__construct OB~~~~
~~~~__construct OB~~~~
~~~~2222~~~~
~~~~333~~~~
&&&&444&&&&
@@@555@@@
原对象: object(MyCloneable)#1 (2) { ["object1"]=>object(SubObject)#2 (2) { ["name"]=> string(4)"dayi" ["age"]=> int(7) }["object2"]=> object(SubObject)#3 (2) {["name"]=> string(4) "dayi" ["age"]=>int(7) } }
Cloned 对象: object(MyCloneable)#4 (2) { ["object1"]=>object(SubObject)#5 (2) { ["name"]=> string(7)"xiaobai" ["age"]=> int(8) }["object2"]=> object(SubObject)#3 (2) {["name"]=> string(4) "dayi" ["age"]=>int(7) } }
核心:所有的属性中的引用 仍然不变,指向原来的变量。
class ByRef
{
}
$a = new ByRef;
$a->prop = 1;
echo '原对象: ';var_dump($a);echo'<br><br>';
$b = clone $a;//本句替换成 $b=$a,结果也还是3,不过不会触发ByRef::__clone,prop不会中间变成2。本例研究的是克隆后,$b->prop引用不变
echo '原对象: ';var_dump($a);echo'<br>';
echo 'clone 对象: ';var_dump($b);echo'<br><br>';
$b->prop = 3; // $a->prop is now3
$b->prop1 = 'oh,u move'; // b的prop1改变了,a的prop1没变
echo '原对象: ';var_dump($a);echo'<br>';
echo 'clone 对象: ';var_dump($b);echo'<br><br>';
echo '原对象的引用prop: ';echo $a->prop;echo'<br>';
echo 'clone 对象的引用prop: ';echo $b->prop;
###################结果###################
原对象: object(ByRef)#6 (2) { ["prop"]=>&int(1) ["prop1"]=> string(15)"haha, i am here" }
原对象: object(ByRef)#6 (2) { ["prop"]=>&int(2) ["prop1"]=> string(15)"haha, i am here" }
clone 对象: object(ByRef)#7 (2) { ["prop"]=>&int(2) ["prop1"]=> string(15)"haha, i am here" }
原对象: object(ByRef)#6 (2) { ["prop"]=>&int(3) ["prop1"]=> string(15)"haha, i am here" }
clone 对象: object(ByRef)#7 (2) { ["prop"]=>&int(3) ["prop1"]=> string(9) "oh,umove" }
原对象的引用prop: 3
clone 对象的引用prop: 3