PHP中的浅复制与深复制
来源:互联网 发布:语音朗读软件 编辑:程序博客网 时间:2024/06/06 09:49
在php中,对象间的赋值操作时间上是引用操作。比如
class myclass{ public $data;}$obj1 = new myclass();$obj1->data = 1;$obj2 = $obj1;$obj2->data = 2;print_r($obj1->data); //输出2print_r($obj2->data); //输出2
但是如果你不直接引用,而是使用clone,就相当于制作了一个独立的副本对象
$obj2 = clone $obj1;$obj2->data = 2; //此时对obj2对象所做的修改就和obj1对象毫无关系了
但是,此时obj1和obj2也并不是完全分离开了,看第二个例子
class itemObject{ public $count = 0; public function add() { $this->count = ++$this->count; }}$item = new itemObject();$obj1->item = $item;print_r($item); //Object ( [count] => 0 )print_r($obj1); //Object ( [data] => 1 [item] => Object ( [count] => 0 ) )$obj2 = clone $obj1;$obj2->data = 2;$obj2->item->add();print_r($item); // Object ( [count] => 1 )print_r($obj1); //Object ( [data] => 1 [item] => Object ( [count] => 1 ) )print_r($obj2); //Object ( [data] => 2 [item] => Object ( [count] => 1 ) )
通过上面的例子可以看到,我们在obj2中改变了一个引用对象的属性,导致所有引用这个对象的对象,包括这个对象自己的属性都被改变了。
这就是所谓的浅复制。
而深复制,就是原形和复制对象完全分离开来。他的实现非常简单,只要我们在被复制对象中增加一个clone魔术方法即可。被复制对象一旦被复制的时候,就放弃自己的属性,把属性给要求复制的对象,然后自己存一个属性的副本;这样我们复制这个对象的时候,后续对象就不会因为引用的关系而改变源对象了。
class myclass{ public $data; public $item; public function __clone() { $this->item = clone $this->itme; }}
阅读全文
0 0
- PHP中的浅复制与深复制
- PHP中的浅复制与深复制
- PHP深复制与浅复制
- php 浅复制与深复制
- java中的浅复制与深复制
- C++中的浅复制与深复制
- C++中的浅复制与深复制
- Java中的深复制与浅复制
- C++中的深复制与浅复制
- C++中的深复制与浅复制
- C++中的浅复制与深复制
- oc 中的浅复制与深复制
- java中的深复制与浅复制
- OC中的深复制与浅复制
- java中的浅复制与深复制
- java中的浅复制与深复制
- iOS中的浅复制与深复制
- React中的浅复制与深复制
- IDW
- 代理模式--动态代理 cglic
- 一起Talk Android吧(第五十四回:Android中的Fragment显示与隐藏一)
- 第1章 Nginx初探
- Docker 学习资源整理
- PHP中的浅复制与深复制
- Linux Commands
- 【备忘】2017年最新Google面试官亲授备战Java校招面试视频讲解教程
- 算法导论习题练习——红黑树的插入和删除
- 台湾大学深度学习课程 学习笔记 lecture2-1 Backpropagation
- Java 自定义 线程池与任务队列
- 09 实现Django自带的注册\登录\退出登录(表单)功能
- Linux Shell
- 使用requirejs编程实现模块化