[PHP] 对象的浅复制与深复制-----“=” 与 “clone”

来源:互联网 发布:jsp企业门户网站源码 编辑:程序博客网 时间:2024/05/28 23:21
    class ObjA{        public $num = 0;        public $objB;        function __construct(){            $this->objB = new ObjB();        }        function __clone(){            $this->objB = clone $this->objB;        }    }    class ObjB{        public $num2 = 0;      }    // 原型对象    $objA  = new ObjA();    // 复制对象 (“=” 复制引用)    $objA2 = $objA;    $objA2->num = 2;    // 随着 $objA2->num 的变化 $objA->num 也变化了    print_r($objA->num.'<br/>');// 结果为 2    print_r($objA2->num.'<br/>'); // 结果为 2    // 复制对象 (“clone” 关键字克隆)    $objA3 = clone $objA;    $objA3->num = 4;    // 随着 $objA3->num 变化  $objA->num 没有变化    print_r($objA->num.'<br/>'); // 结果为 2    print_r($objA3->num.'<br/>'); // 结果为 4    // 但是 php 版本为 5.6 时, clone 的对象(是聚合类) 中包含其他对象时所包含的对象(objB) 复制的是引用 (这应该是一个 BUG)    //  php 7.1.3 版本修复了这个问题 $objA->objB->num2 的值为 0    $objA3->objB->num2 = 7;    print_r($objA3->objB->num2.'<br/>');// 结果为 7    print_r($objA->objB->num2.'<br/>');// 结果为 (PHP5.6 值为 7 , PHP7.1.3 值为 0)
原创粉丝点击