【问题标题】:php __clone() and the "shallow clone"php __clone() 和“浅克隆”
【发布时间】:2011-08-14 03:29:07
【问题描述】:

__clone() 的结果是“浅克隆”是什么意思?

【问题讨论】:

    标签: php clone


    【解决方案1】:

    这意味着当对象被克隆时,任何作为引用变量(引用其他对象而不是值的变量)的属性都将保持引用。

    “非浅层”克隆会将新对象设置为这些属性的值,而不是将它们作为引用。

    注意:这意味着您对克隆对象中的这些引用所做的任何更改也会对它们在“父”对象中引用的值进行。

    【讨论】:

    • “注意”是错误的:只有对克隆对象的属性/值的每次更改,即引用,才会影响原始对象。原始类型永远不是引用,如果将一个对象替换为另一个对象,这也只会影响一个对象,而不会影响另一个对象。
    • 是的,我就是这个意思。澄清。
    【解决方案2】:

    简而言之:克隆将保持与克隆它的原始对象相同的引用。像字符串或整数这样的原始类型永远不是引用(在 php 中),如果您完全更改一个引用(通过将属性的对象替换为另一个引用),这也不会影响原始对象。每个属性都将包含 same 而不仅仅是 identical 对象,而不是另一个对象的同名属性。

    要创建非燕子副本,您必须实现 __clone()。克隆后在克隆对象上调用。

    public function __clone () {
      $this->myObject = clone $this->myObject;
      // and so on
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-11
      • 2013-04-28
      • 1970-01-01
      • 2015-08-18
      • 2017-09-17
      • 1970-01-01
      • 2020-06-26
      相关资源
      最近更新 更多