zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Linux 删除用户时报错:userdel: user zhoulijiang is currently used by process 1
    mysqldump: Error: Binlogging on server not active
    Java并发编程:阻塞队列
    Java并发编程:线程池的使用
    Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
    Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
    Java常用排序算法/程序员必须掌握的8大排序算法
    KMP算法
    Java NIO:浅析I/O模型
    Java NIO:NIO概述
  • 原文地址:https://www.cnblogs.com/llkbk/p/7417190.html
Copyright © 2011-2022 走看看