PHP使用clone关键字复制对象

来源:互联网 发布:多头螺纹加工怎么编程 编辑:程序博客网 时间:2024/05/20 07:51

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));

打印结果:
这里写图片描述

各变量之间完全没有影响了