$ this-> myObject = clone $ this-> myObject;

时间:2014-08-14 15:55:51

标签: php oop

我对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;

任何人都可以放下任何光线都将是一个巨大的帮助。

1 个答案:

答案 0 :(得分:2)

好问题。

您指出的行是克隆引用的对象,因此避免了双指针问题。

因此,_clone方法不仅克隆了对象本身,还克隆了它所引用的所有对象。

例如,如果您有一个id为1的汽车对象,该汽车对象引用了ID为1的引擎对象,则在克隆之后,您将拥有一个由2标识的新汽车和一个由2标识的新引擎。 如果没有_clone扩展名,您就可以通过2引用由1标识的引擎来识别汽车。

请注意,只有具有非基本类型作为属性的对象才需要魔法克隆。