PHP浅复制与深复制是什么,怎样说明

Admin 2022-08-16 群英技术资讯 205 次浏览

今天这篇我们来学习和了解“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操作就是浅复制,序列化反序列化就是深复制


关于“PHP浅复制与深复制是什么,怎样说明”就介绍到这了,如果大家觉得不错可以参考了解看看,如果想要了解更多,欢迎关注群英网络,小编每天都会为大家更新不同的知识。 群英智防CDN,智能加速解决方案

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

猜你喜欢

成为群英会员,开启智能安全云计算之旅

立即注册
专业资深工程师驻守
7X24小时快速响应
一站式无忧技术支持
免费备案服务
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
在线客服
微信公众号
返回顶部
返回顶部 返回顶部
在线客服
在线客服