PHP __clone() 和“浅克隆”

7
当__clone()方法的结果是“浅克隆”时,这意味着仅复制对象本身,而不会复制对象中包含的引用类型属性。
2个回答

8

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

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

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


“note”是错误的:只有对克隆对象的属性/值进行更改,才会影响原始对象。原始类型永远不是引用,如果您用另一个对象替换一个对象,这也只会影响一个对象,而不会影响另一个对象。 - KingCrunch
是的,那就是我的意思。已经澄清了。 - BraedenP

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

要创建非浅拷贝,必须实现__clone()。这将在克隆后调用克隆对象。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接