PHP使用clone关键字复制对象
2017-05-23 15:44
288 查看
1.关键字clone
class testClass { public $attr1; public $attr2; } $obj = new testClass(); $obj -> attr1 = 'a'; $obj -> attr2 = 'b'; $copy_obj = $obj; ## 使用关键字clone可以完成对对象的复制 ## $copy_obj_new = clone $obj; var_dump($obj); var_dump($copy_obj); var_dump($copy_obj_new);
打印结果为:
$obj -> attr1 = 'c'; var_dump($obj); var_dump($copy_obj); var_dump($copy_obj_new);
打印结果为:
实例化对象后的赋值引用赋值,使用关键字clone可以完成对对象的复制得到新的独立的对象
2. __clone() 方法
使用关键字 clone 克隆一个对象,新创建的对象(复制生成的对象)中的 __clone() 方法会被调用class testClass { public $attr1; public $attr2; public function __clone() { $this -> attr1 = 'x'; } } $obj = new testClass(); $obj -> attr1 = 'a'; $obj -> attr2 = 'b'; var_dump($obj); $copy_obj_new = clone $obj; var_dump($copy_obj_new);
打印结果如下:
3.浅复制与深复制
class newClass { public $newAttr = 'm'; } class testClass { public $attr1; public $attr2; } $obj = new testClass(); $obj -> attr1 = 'a'; $obj -> attr2 = new newClass(); var_dump($obj); $copy_obj_new = clone $obj; $copy_obj_new -> attr1 = 'b'; $copy_obj_new -> attr2 -> newAttr = 'n'; var_dump($obj); var_dump($copy_obj_new);
打印结果:
clone后属性值为非对象时,复制前后是独立的,没有相互影响。属性值为对象时,对象的属性值仍然指向同一个变量(我所理解的浅复制)
有两种方法解决上述问题,一种是使用__clone()方法,另一种是序列与反序列
public function __clone () { $this -> attr2 = clone new newClass(); }
这个方法属性值为对象太多的话,就要一个个的添加,可能会死人。
上述代码:$copy_obj_new = clone $obj;替换为下面的代码 $copy_obj_new = unserialize(serialize($obj));
打印结果:
各变量之间完全没有影响了
相关文章推荐
- 关于Java对象复制(Clone、深度Clone以及序列化与反序列化的使用)
- PHP 面向对象中常见关键字使用(final、static、const和instanceof)
- php面向对象全攻略 (十) final static const关键字的使用
- PHP中的对象复制及__clone() 函数
- 对象的复制:浅复制(clone()方法的使用)+深复制
- php 对象复制(克隆)clone()
- PHP 对象克隆 clone 关键字与 __clone() 方法
- java中equals和==之间的区别?clone方法的作用,及其为什么要使用clone方法?如何使用clone复制对象?以及深克隆浅克隆
- php面向对象全攻略 (十) final static const关键字的使用
- php面向对象中static 关键字的使用
- Php面向对象--使用__clone()克隆对象
- [PHP] 对象的浅复制与深复制-----“=” 与 “clone”
- php之clone 复制对象以及__clone魔术方法
- 【PHP】对象的复制(拷贝)与__clone()方法
- 关于PHP中的对象(类的实例)的复制、clone(克隆)
- PHP 5.0对象模型深度探索之对象复制
- php面向对象全攻略 (三)特殊的引用“$this”的使用
- ArcSDE复制数据时出现ORA-00955名称已由现有对象使用错误的解决方法
- js中json对象在php中的使用