在PHP中使用__clone?

zam*_*mil 13 php object

我有一个类a并使用new实例化它

$obja = new a;
Run Code Online (Sandbox Code Playgroud)

我知道下面两行之间的区别

$obja2 = $ojba;
$obja2 = clone $obja;
Run Code Online (Sandbox Code Playgroud)

但即使您在类a中声明或未声明__clone,第一行$ obja2引用$ obja内存空间,第二行创建$ obja的副本.直到这里我很清楚.

那么为什么php有一个神奇的方法__clone?它是否只用于执行一组代码,这些代码写在__clone中,而我们使用$ obja2 = clone $ obja;

有人请帮助更好地了解它.

dec*_*eze 17

void __clone ( void )
Run Code Online (Sandbox Code Playgroud)

克隆完成后,如果__clone()定义了方法,则将__clone()调用新创建的对象的方法,以允许任何需要更改的必要属性.

http://php.net/manual/en/language.oop5.cloning.php#object.clone

所以是的,这是操作完成后的回调clone.没有更多,没有更少.

  • 其他例子:`clone`创建一个"浅拷贝".这意味着,只有对象本身被克隆,而不是它的关联.因此,如果`A`的这个对象与其他对象有关联,_Must_在差异实例`A`之间是唯一的,你必须克隆`__clone()`中的关联:`$ this-> otherObject = clone $ this-> otherObject;` (7认同)
  • 这取决于您想要/需要做什么。PHP“克隆”操作的默认行为足以满足您在克隆对象时想要执行的操作吗?那么就没有必要了。如果您需要执行更多操作来创建“完整”克隆,请在“__clone”回调方法中添加该代码。蹩脚的例子:如果你的每个对象都需要有一个唯一的 ID(`$this->id` 变量或类似的东西),你需要在克隆后生成一个新的 ID,以避免两个对象具有相同的 ID。 ID。 (2认同)

Dan*_*iro 9

clonePHP中的关键字代表浅层副本.

为了实现深层复制,您需要实现魔术方法__clone

如果使用simple clone关键字克隆具有成员的对象,该成员是另一个类的对象,则将保留对该第二个对象的相同引用.

这就是深拷贝派上用场的地方,有这样的东西:

public function __clone()
{
    $this->someOtherObject = clone $this->someOtherObject;
}
Run Code Online (Sandbox Code Playgroud)

有了它,你可以保证克隆是深的,这意味着它也将克隆成员对象,而不是仅保留对它们的原始引用.

  • `S /阴影/浅/` (4认同)