<?php
class Test1 {
public $num1 = 0;
//包含的对象
public $obj2;
public function __construct() {
$this->obj2 = new Test2;
}
}
class Test2 {
public $num2 = 0;
}
$obj1 = new Test1;
/*
PHP对象复制可以通过clone关键字来完成,当对象被复制后,
PHP5会对对象的所有属性执行一个浅复制(shallow copy)。
所有的引用属性仍然会是一个指向原来的变量的引用。
*/
$obj = clone $obj1;
$obj1->num1 = 1;
$obj1->obj2->num2 = 1;
var_dump($obj->num1, $obj->obj2->num2); #结果返回0和1
//由此看出,此处执行了一个浅复制,只复制了基本属性,对象属性仍为指向原有变量的一个引用。
<?php
class Test1 {
public $num1 = 0;
//包含的对象
public $obj2;
public function __construct() {
$this->obj2 = new Test2;
}
public function __clone() {
//实现深复制
$this->obj2 = clone $this->obj2;
}
}
class Test2 {
public $num2 = 0;
}
$obj1 = new Test1;
$obj = clone $obj1;
$obj1->num1 = 1;
$obj1->obj2->num2 = 1;
var_dump($obj->num1, $obj->obj2->num2); #结果返回0和0
//由此看出,此处执行了一个深复制,所有属性都创建了一个副本。