php面向对象Clone与序列化
来源:互联网 发布:中国柬埔寨关系 知乎 编辑:程序博客网 时间:2024/05/16 12:09
对象的复制时有三种方案:
1,直接复制 $a = $b
这种是浅拷贝,当改变$a的时候$b也会改变,因为他们指向的是同一块堆区
2,clone复制 $a = clone $b
这种拷贝貌似是深拷贝,当$a发生变化的时候$b不会跟着变化,同时PHP提供了魔术方法__Clone()可以自定义Clone复制,哪些属性不想被复制,复制过程中需要哪些改变,都可以在__clone()方法中自定义。
但是这种复制的方法有个缺陷,需要注意,如果类中的某个属性的类型是另外一个类,那么在Clone的时候这个属性会不会被深拷贝,是不是很尴尬,当然这点缺陷是可以通过魔术方法__clone来进行弥补的,在__clone()方法中为这个属性new一个新的类就是了。
class test{private $name;private $sex;private $demo;public function __construct($name,$sex,$demo){$this->name = $name;$this->sex = $sex;$this->demo = $demo;}public function __set($key,$value){$this->{$key} = $value;}public function __get($key){return $this->{$key};}public function __clone(){$this->name='null'; //这里可以自定义clone}}
class demo{private $name;public function __construct($name='demo01'){$this->name = $name;}public function __set($key,$value){$this->{$key} = $value;}public function __get($key){return $this->{$key};}}
$t = new test('aa', 'bb',new demo('d01'));$d = clone $t;//$d->name='nihao';$d->demo->name = 'd02';var_dump($t); //结果 $t->demo->name d02使用clone弥补
public function __clone(){$this->name='null';$this->demo = new demo('init');}
3,序列化复制
$b = unserialize(serialize($t));这样不需要使用clone魔术方法既可以实现属性中引用类型的深拷贝了。
0 0
- php面向对象Clone与序列化
- php面向对象之序列化与反序列化
- PHP面向对象——clone关键字
- PHP面向对象——clone关键字
- PHP面向对象4-序列化
- 关于Java对象复制(Clone、深度Clone以及序列化与反序列化的使用)
- 《深入php面向对象、模式与实践》读书笔记——Clone
- 克隆Clone 与序列化
- 生成对象-new、clone、序列化、反射
- 说说面向对象clone
- java使用serializable进行序列化与反序列化实现对象clone(克隆)
- php面向对象(OOP)—序列化(串行化)与反序列化之serialize(),unserialize,__sleep(),__wakeup()
- php 对象克隆 clone
- PHP克隆对象clone
- php中的clone对象
- php 对象clone
- PHP面向对象与面向过程实例
- PHP 对象序列化
- Linux下用W3M浏览网页
- USACO Roads and Planes
- 网站搭建之php
- 符号&数组名&变量
- 负载均衡
- php面向对象Clone与序列化
- Java HashMap 核心源码解读
- opencv和pcl的flann冲突的解决
- 统计学习第一发
- ConcurrentHashMap原理分析
- Python入门教程--列表
- hdu 2563 统计问题
- c++ list
- 黑马程序员—多线程