20

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

$obja = new a;

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

$obja2 = $ojba;
$obja2 = clone $obja;

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

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

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

4

2 回答 2

24
void __clone ( void )

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

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

所以是的,这是操作完成后的回调。clone不多也不少。

于 2012-12-20T11:10:47.073 回答
22

PHP 中的clone关键字表示浅拷贝

为了实现深拷贝,你需要实现魔术方法。__clone

如果您克隆一个对象,该对象的成员是另一个使用 simpleclone关键字的类的对象,您将保持对第二个对象的相同引用。

这就是深层副本派上用场的地方,如下所示:

public function __clone()
{
    $this->someOtherObject = clone $this->someOtherObject;
}

这样,您就可以保证克隆是deep,这意味着它也会克隆成员对象,而不是只保留对它们的原始引用。

于 2012-12-20T11:10:28.207 回答