博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP深浅拷贝
阅读量:5094 次
发布时间:2019-06-13

本文共 1124 字,大约阅读时间需要 3 分钟。

举个栗子:

name = $name; }}$ex1 = new Example('test1');// $ex1->name现在是:test1$ex2 = $ex1;// $ex2->name现在是:test1$ex2->name = 'test2';// 这样修改一下之后,$ex1->name与$ex2->name都变为了:test2

通过上面这个例子,应该可以理解对象间引用的概念了,那么我们继续往下走,在php中提供了 clone 这个关键字来进行对象复制,还是用上面的类来演示一下:

$ex1 = new Example('test1');// $ex1->name现在是:test1$ex2 = clone $ex1;//$ex2->name现在是:test1$ex2->name = 'test2';//现在$ex1->name还是test1,而$ex2->name是test2

这里看到,通过clone之后,$ex1$ex2是两个不同的对象,他们拥有各自的变量环境。但是这里需要注意,在这两个对象内部,拥有的是值类型的数据,如果是内部拥有的是引用类型,那么通过clone得到的新对象中的引用则仍然指向原引用。这里就引申出 浅复制 与 深复制 的概念: 

浅复制: 使用clone来复制对象,这种复制叫做“浅复制“,被赋值对象的所有变量都还有与原来对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。 

深复制:被复制的对象的所有的变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。

默认使用 clone 是进行一个浅复制,那么如何才能进行深复制呢

方式一:利用__clone方法

public function __clone(){    $this->obj = new Obj();}

这种方式非常直观,但是却有一个很麻烦的操作方式,就是当类中包含多个引用时,你就需要在__clone方法中逐个重新设置。而且还要处理一些循环引用的问题。是很复杂的。

方式二:利用串行化(冷藏与解冻)

$tmp = serialize($ex1);$ex2 = unserialize($tmp);

这时候得到的$ex2就是一个全新的对象,这个过程在java中也叫作”冷藏“与”解冻“过程。 序列化是一个递归的过程,我们不需要理会被对象内部引用了多少个对象以及引用了多少层对象,我们都可以彻底的复制。方式二真的很黄很暴力,但是我很喜欢。

 

 

&的概念:

&属于引用,属于浅拷贝,一个改变另外一个也随之改变。

1 

 

转载于:https://www.cnblogs.com/nul1/p/9418080.html

你可能感兴趣的文章
HTML | video的封面平铺方法
查看>>
PTA --- 时间复杂度 选择题
查看>>
网站数据分析图表导出为文件
查看>>
Scala之Option: Some None
查看>>
常见排序算法及其对应的时间复杂度和空间复杂度
查看>>
Sublime写cpp时无法定位程序输入点__gxx_personality_v0的问题
查看>>
菲佣WPF——4(关于DataTemplate(2)动态控件添加神器)
查看>>
LCA-倍增法(在线)O(nlogn)-O(logn)
查看>>
python-study-19
查看>>
with
查看>>
Unix/Linux环境下性能分析工具介绍一(基础工具篇)
查看>>
重写和重载
查看>>
Ajax实现五级联动--(一)
查看>>
TypeError: list indices must be integers or slices, not tuple
查看>>
获取服务器基本信息.sh
查看>>
docker --help 详解
查看>>
摩尔投票法
查看>>
【转】Java中 List的遍历
查看>>
solr 使用指定数据源
查看>>
由简单的CMD命令引发的一场学习战斗
查看>>