温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

PHP对象复制举例分析

发布时间:2021-11-25 16:42:11 阅读:154 作者:iii 栏目:大数据
PHP开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

本篇内容主要讲解“PHP对象复制举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP对象复制举例分析”吧!

原型模式可以看作是对象复制中的一个重要内容。在学习原型模式时,我们了解到对象中的引用变量,也就是变量也是一个对象时,直接复制这个对象会导致其中的引用变量还是指向同一个对象。是不是有点绕,我们还是用例子来说明:

// clone方法class testA{    public $testValue;}class A{    public static $reference = 0;    public $instanceReference = 0;    public $t;    public function __construct()    {        $this->instanceReference = ++self::$reference;        $this->t = new testA();    }    public function __clone()    {        $this->instanceReference = ++self::$reference;        $this->t = new testA();    }}$a1 = new A();$a2 = new A();$a11 = clone $a1;$a22 = $a2;var_dump($a11); // $instanceReference, 3var_dump($a22); // $instanceReference, 2$a1->t->testValue = '现在是a1';echo $a11->t->testValue, PHP_EOL; // ''$a2->t->testValue = '现在是a2';echo $a22->t->testValue, PHP_EOL; // 现在是a2$a22->t->testValue = '现在是a22';echo $a2->t->testValue, PHP_EOL; // 现在是a22// 使用clone$a22 = clone $a2;var_dump($a22); // $instanceReference, 4$a2->t->testValue = '现在是a2';echo $a22->t->testValue, PHP_EOL; // NULL$a22->t->testValue = '现在是a22';echo $a2->t->testValue, PHP_EOL; // 现在是a2
 

首先,通过变量的变化,我们可以看出使用clone关键字的对象复制会调用__clone()方法。这个魔术方法正在原型模式的核心所在。在这个方法中,我们可以重新实例化或者定义对象中的引用成员。通过clone,我们让t成为了新的对象,从而避免引用带来的问题。

在对象的复制中,我们需要特别注意的递归引用的问题。也就是对象内部引用了自身,将会导致来回的重复引用形成递归死循环。

// 循环引用问题class B{    public $that;    function __clone()    {        // Segmentation fault: 11        $this->that = clone $this->that;        // $this->that = unserialize(serialize($this->that));        // object(B)#6 (1) {        //     ["that"]=>        //     object(B)#7 (1) {        //       ["that"]=>        //       object(B)#8 (1) {        //         ["that"]=>        //         *RECURSION*  无限递归        //       }        //     }        //   }    }}$b1 = new B();$b2 = new B();$b1->that = $b2;$b2->that = $b1;$b3 = clone $b1;var_dump($b3);

B类中的that指向自身的实例,两个对象相互指向后再进行复制,就会出现这种死循环的情况。使用序列化和反序列化输出后,我们会看到RECURSION的引用提示。这就是形成了递归的死循环。这种情况一定要极力避免。

上述例子中,我们使用了序列化和反序列化这一招来解决引用问题。对象复制的对象变量来说(对象变量里面还有更多层次的引用变量),这种方式能够一次性地在最顶层的对象__clone()方法中解决引用问题。

到此,相信大家对“PHP对象复制举例分析”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

原文链接:https://my.oschina.net/u/4580631/blog/4362278

php
AI

开发者交流群×