background image

}

}

在__clone()方法内部,会有一个保存在 $this 变量中的浅拷贝来表示 PHP 在没有

__clone()

 

方法时所提供的对象。

因为 PHP 已经拷贝了所有属性,所以只需要覆盖不需要的属性即可。在这个例子中,

$name 是没问题的,只有$address 需要明确地克隆。

现在,如下面例子所示,克隆行为被纠正了。

$rasmus=newPerson;

$rasmus->setName('Rasmus Lerdorf');

$rasmus->setCity('Sunnyvale');

$zeev=clone$rasmus;

$zeev->setName('Zeev Suraski');

$zeev->setCity('Tel Aviv');

print$rasmus->getName() .' lives in '.$rasmus->getCity() .'.';

print$zeev->getName() .' lives in '.$zeev->getCity() .'.';

Rasmus Lerdorf lives in Sunnyvale.

Zeev Suraski lives in Tel Aviv.

使用克隆操作符克隆保存在属性中的对象,会导致 PHP 检测这些对象中是否包含

__clone()方法。如果包含一个,PHP 就会调用它。而且,即使对于嵌套在更深层中的对象

 

也会重复这样地检测。

这一过程保证了正确地克隆完整的对象,并且也证明了它为什么被称为深度拷贝。