php 克隆 __clone

php 克隆 clone

在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。

在php语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单,也是最高效的手段。

核心:

$obj = new MyCloneable();

$obj2 = clone $obj;

所有的属性中的引用 仍然不变,指向原来的变量。

class ByRef
{
    var $prop;
    function __construct()
     {
        $this->prop =& $this->prop;//&地址引用 指向同一个内存地址
         $this->prop1 = 'haha, i am here';
    }
     function __clone()
    {   
            $this->prop=2;// $a->prop is now 2
    }
}
$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 now 3
$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,u move" }

原对象的引用prop: 3
clone 对象的引用prop: 3

 转http://blog.sina.com.cn/s/blog_54e38bdc0100xhm7.html

posted @ 2017-08-23 11:09  顺瓜摸藤  阅读(1014)  评论(0编辑  收藏  举报