我对PHP中的对象克隆有疑问。我知道克隆会创建一个"深拷贝"因为创建了一个新对象,其变量初始化为克隆它的对象中相应变量的值。但是,as discussed here,这意味着任何引用变量都将引用相同的值,可能会产生问题。
我阅读的书提供了以下解决方案,类似于上面链接中给出的解决方案:
class ReferenceClass {
public $msg = 'Reference Object';
}
class CloneClass {
public $refObj;
public function __construct() {
$this->refObj = new ReferenceClass();
}
public function __clone() {
$this->refObj = clone $this->$refObj;
}
}
然而,尽我所能,我不能围绕这条线路发生的事情:
$this->refObj = clone $this->$refObj;
任何人都可以放下任何光线都将是一个巨大的帮助。
答案 0 :(得分:2)
好问题。
您指出的行是克隆引用的对象,因此避免了双指针问题。
因此,_clone
方法不仅克隆了对象本身,还克隆了它所引用的所有对象。
例如,如果您有一个id为1的汽车对象,该汽车对象引用了ID为1的引擎对象,则在克隆之后,您将拥有一个由2标识的新汽车和一个由2标识的新引擎。
如果没有_clone
扩展名,您就可以通过2引用由1标识的引擎来识别汽车。
请注意,只有具有非基本类型作为属性的对象才需要魔法克隆。