Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php $this->;myObject=clone$this->;肌体;_Php_Oop - Fatal编程技术网

Php $this->;myObject=clone$this->;肌体;

Php $this->;myObject=clone$this->;肌体;,php,oop,Php,Oop,我有一个关于PHP中对象克隆的问题。我知道克隆会创建一个“深度副本”,即创建一个新对象,并将其变量初始化为克隆对象中相应变量的值。但是,这意味着任何引用变量都将引用相同的值,可能会产生问题 我正在读的这本书给出了以下解决方案,类似于上面链接中给出的解决方案: class ReferenceClass { public $msg = 'Reference Object'; } class CloneClass { public $refObj; public function __

我有一个关于PHP中对象克隆的问题。我知道克隆会创建一个“深度副本”,即创建一个新对象,并将其变量初始化为克隆对象中相应变量的值。但是,这意味着任何引用变量都将引用相同的值,可能会产生问题

我正在读的这本书给出了以下解决方案,类似于上面链接中给出的解决方案:

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;
任何人能提供的任何信息都将是巨大的帮助。

好问题

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

因此,
\u clone
方法不仅克隆对象本身,还克隆其引用的所有对象

例如,如果您有一个id为1的car对象,它引用了id为1的engine对象,那么在克隆之后,您将有一个由2标识的新车和一个由2标识的新引擎。 如果没有
\u clone
扩展,您将拥有一辆由2标识的汽车,并引用由1标识的发动机


请注意,只有属性为非基本类型的对象才需要magic clone。

不确定这是否对您有帮助,但在官方PHPOOP5文档中有一个与您的情况非常类似的示例:。检查示例#1它看起来像是在说“制作深度副本时,制作引用对象成员的深度副本”。获取真正深度拷贝的最简单的方法(我认为)是
unserialize(serialize($obj))
在使用clone克隆被引用对象时,如果被引用对象中也有引用变量,您不会再次遇到同样的问题吗?是的,这就是为什么您应该在所有相关对象中实现此方法的原因(具有非基本类型作为属性的对象。)好的,在上面的例子中,ReferenceClass中不需要_clone magic方法,因为ReferenceClass的唯一变量是基元的。这种理解正确吗?另外:这是否也意味着在克隆时不使用_构造方法?等等,我是唯一一个无法克隆对象的人吗?它抛出了一个致命错误,并且有他的感觉。Somewhat correct-不要忘记源对象在创建时已经经过了_构造,因此可以保证某些字段等的有效性。它是一个钩子,用于重置每个对象的唯一字段,并克隆不希望引用的字段。