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));
打印结果:
各变量之间完全没有影响了