PHP浅复制与深复制是什么,怎样说明
Admin 2022-08-16 群英技术资讯 786 次浏览
今天这篇我们来学习和了解“PHP浅复制与深复制是什么,怎样说明”,下文的讲解详细,步骤过程清晰,对大家进一步学习和理解“PHP浅复制与深复制是什么,怎样说明”有一定的帮助。有这方面学习需要的朋友就继续往下看吧!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进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
在本篇文章中我们给大家整理了关于PHP中filesize函数的用法和相关知识点,有需要的朋友们学习下。
事务对于很多新手来说都是比较难理解的内容,为了帮助大家熟悉事务,这篇文章就给大家介绍关于laravel eloquent实现事务的方式,下面我们一起来学习一下吧。
变量的范围即它定义的上下文背景(也就是它的生效范围)。大部分的PHP变量只有一个单独的范围。这个单独的范围跨度同样包含了include和require引入的文件。例如:<?...
本篇文章给大家带来了关于Laravel的相关知识,其中主要介绍了一些基础知识,包括了怎么安装Laravel、路由、验证器、视图等等相关内容,下面一起来看一下,希望对大家有帮助。
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。提示:数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因此用单例模式来维护,就可以大大降低这种损耗。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008