php __clone() 和“浅克隆”

Posted

技术标签:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

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

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

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

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

【讨论】:

以上是关于php __clone() 和“浅克隆”的主要内容,如果未能解决你的问题,请参考以下文章

浅谈浅克隆(shallow clone)和 深克隆(deep clone)

Jquery浅克隆与深克隆

Java深拷贝和浅拷贝(深克隆和浅克隆)

浅克隆与深克隆

java对象的浅克隆和深克隆

Java浅克隆和深克隆