在 PHP 中使用__clone?

2022-08-30 19:43:20

我有一个类a,并使用新的实例化它

$obja = new a;

我知道下面两行的区别

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

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

那么为什么php有一个神奇的方法__clone呢?它是否仅用于执行一组代码,这些代码是在__clone内编写的,而我们使用$obja 2 =克隆$obja;

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


答案 1
void __clone ( void )

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

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

所以,是的,这是操作完成后的回调。仅此而已,仅此而已。clone


答案 2

PHP 中的关键字表示浅层副本clone

为了实现深度复制,你需要实现神奇的方法。__clone

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

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

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

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


推荐