类以及调用:
class Tclone {
protected $id = 1;
}
echo '<pre>';
$tclone1 = new Tclone();
var_dump($tclone1);
$tclone2 = clone $tclone1;
var_dump($tclone2);
$tclone3 = $tclone1;
var_dump($tclone3);
结果:
object(Tclone)#1 (1) {
["id":protected]=>
int(1)
}
object(Tclone)#2 (1) {
["id":protected]=>
int(1)
}
object(Tclone)#1 (1) {
["id":protected]=>
int(1)
}
通过以上结果可以看出使用clone
关键字克隆的是两个不同的对象,通过赋值的两个是同一个对象点不同引用。虽然出自于同一个类__Tclone__,但是__Tclone__对象指向类的指针是1,而__Tclone2__对象指向类的指针式2,__Tclone3__指向类的指针的也是1。我们在使用过程中要根据情况区别对待。
通过clone
关键字进行克隆对象的时候,类的属性值也一样复制过来了,但是有时候我们是不需要的,PHP中可以通过__clone
魔术方法进行克隆控制。
修改后的类:
class Tclone {
protected $id = 1;
public function __clone()
{
$this->id = 0;
}
}
再次执行php文件,结果显示:
object(Tclone)#1 (1) {
["id":protected]=>
int(1)
}
object(Tclone)#2 (1) {
["id":protected]=>
int(0)
}
object(Tclone)#1 (1) {
["id":protected]=>
int(1)
}
Tclone2对象的id值变为0了,赋值的Tclone3对象点值与原来Tclone1的值还是一样的。
通过这些比较我们需要在使用中,根据不同的场景,选择相适应的使用方式。。