php中对象的复制

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();

$obj2 = clone $obj;

//调用MyCloneable::__clone方法。clone方法重置想改变项,返回修改后的类的实例给pbj2.

<?php
class SubObject
{

public$name;
public$age;
publicfunction __construct() {
echo '~~~~__constructOB~~~~<br>';
$this->name = 'dayi';
$this->age = 7;
}

publicfunction __clone() {

echo '~~~~333~~~~<br>';
$this->name = 'xiaobai';
$this->age = 8;
}
}

class MyCloneable
{
public$object1;
public$object2;

publicfunction __construct() {
echo '~~~~__constructOA~~~~<br>';

}
function__clone()
{
echo '~~~~2222~~~~<br>';
//print_r($this->object1); SubObject Object ( [name]=> [age] => 7 )
$this->object1 = clone$this->object1; //调用SubObject::__clone方法。clone方法重置想改变项(变为xiaobai,8),返回修改后的类的实例给$this->object1.
// print_r($this->object1);SubObject Object ( [name]=> xiaobai [age] => 8 )
echo'&&&&444&&&&<br>';
}
}

$obj = new MyCloneable();
echo '!!!1111!!!<br>';
$obj->object1 = new SubObject();

$obj->object2 = new SubObject();

$obj2 = clone$obj;//调用MyCloneable::__clone方法。clone方法重置想改变项,返回修改后的类的实例给pbj2.

echo'@@@555@@@<br><br><br>';

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
{
var$prop;
function__construct()
{
$this->prop =&$this->prop;
$this->prop1 = 'haha, i am here';
}
function __clone()
{
$this->prop=2;// $a->prop is now2
}
}
$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


取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论