我有一个类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
Run Code Online (Sandbox Code Playgroud)void __clone ( void )克隆完成后,如果
__clone()定义了方法,则将__clone()调用新创建的对象的方法,以允许任何需要更改的必要属性.http://php.net/manual/en/language.oop5.cloning.php#object.clone
所以是的,这是操作完成后的回调clone.没有更多,没有更少.
clonePHP中的关键字代表浅层副本.
为了实现深层复制,您需要实现魔术方法__clone
如果使用simple clone关键字克隆具有成员的对象,该成员是另一个类的对象,则将保留对该第二个对象的相同引用.
这就是深拷贝派上用场的地方,有这样的东西:
public function __clone()
{
$this->someOtherObject = clone $this->someOtherObject;
}
Run Code Online (Sandbox Code Playgroud)
有了它,你可以保证克隆是深的,这意味着它也将克隆成员对象,而不是仅保留对它们的原始引用.