PHP浅复制与深复制是什么,怎样说明
Admin 2022-08-16 群英技术资讯 334 次浏览
php用clone复制对象有一个问题,下面用代码来说明问题:
class Foo{ public $bar; public $name; public function __construct(Bar $bar , $name){ $this->bar = $bar; $this->name = $name; } } class Bar{ public $name; public function __construct($name){ $this->name = $name; } } $bar = new Bar('bar obj'); $foo = new Foo($bar , 'foo obj'); $cloneFoo = clone $foo; $cloneFoo->name = 'clone foo obj'; $cloneFoo->bar->name = 'new bar obj'; var_dump($foo->name); var_dump($foo->bar->name); var_dump($cloneFoo->name); var_dump($cloneFoo->bar->name);
输出是:
string 'foo obj' (length=7) string 'new bar obj' (length=11) string 'clone foo obj' (length=13) string 'new bar obj' (length=11)
输出说明了一个问题:$cloneFoo->bar->name = 'new bar obj';这句话本意是想把$cloneFoo中的$bar的name修改了。但是却顺带着把$foo的$bar的name也给修改了。也就是说$foo与$cloneFoo中的bar是同一个bar。这说明如果对象 Foo 中保存着对象 Bar 的引用,当你复制对象 Foo时,php并不会克隆一个Bar对象让后帮你把这个克隆出来的Bar给你装到克隆出来的cloneFoo中。
那么如何解决这个问题呢,可以利用php的序列化
$bar = new Bar('bar obj'); $foo = new Foo($bar , 'foo obj'); $cloneFoo = unserialize(serialize($foo)); $cloneFoo->name = 'clone foo obj'; $cloneFoo->bar->name = 'new bar obj'; var_dump($foo->name); var_dump($foo->bar->name); var_dump($cloneFoo->name); var_dump($cloneFoo->bar->name);
输出:
string 'foo obj' (length=7) string 'bar obj' (length=7) string 'clone foo obj' (length=13) string 'new bar obj' (length=11)
序列化是一个递归的过程,我们不需要理会被对象内部引用了多少个对象以及引用了多少层对象,我们都可以彻底的复制。
clone操作就是浅复制,序列化反序列化就是深复制。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
laravel框架怎样实现前后端分离路由?如果我们将路由全部写在一个文件,无疑会显得路由杂乱不堪,也不利于维护。因此我们需要对laravel路由分离。下面是实现步骤:
如何理解PHP状态模式,有哪些要点?一些朋友可能会遇到这方面的问题,对此在下文小编向大家来讲解一下,内容详细,易于理解,希望大家阅读完这篇能有收获哦,有需要的朋友就往下看吧!
PHP图像处理怎样获取索引的颜色?一些朋友可能会遇到这方面的问题,对此在下文小编向大家来讲解一下,内容详细,易于理解,希望大家阅读完这篇能有收获哦,有需要的朋友就往下看吧!
php中的四种标量类型:1、布尔型(boolen)值是FALSE和TRUE。2、整型(integer)。3、浮点型(float,也称double,两个名称同时存在)。4、字符串(string)。
PHP 提供了丰富的图像处理函数,下面我们来看看都有哪些,及它们的用处是什么。此外,本文还介绍了GD库的使用,希望这篇文章能帮助大家,下面我们一起来了解看看吧。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008