类以及调用:

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的值还是一样的。

通过这些比较我们需要在使用中,根据不同的场景,选择相适应的使用方式。。