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() 和“浅克隆”的主要内容,如果未能解决你的问题,请参考以下文章