__clone()和unserialize(serialize())有何区别?

4
根据这个问题的参考,我找到了另一个解决方案:使用“clone”方法。
$obj2 = unserialize(serialize($obj1));

替代
$obj2 = clone $obj1;

哪一个更好用?


克隆,但我不知道是否能够“证明”它。 - user557846
@Dagon:我同意。但是任何解释都可以。 - Gaurav
1
Philwinkle说的没错 :-) - user557846
2个回答

11

简短版:对于简单对象和树形结构,可以使用clone。对于复杂的对象图,可以使用unserialize(serialize())

详细说明:如果$obj1没有实现__clone()方法,则表达式clone $obj1将返回$obj1的浅拷贝,但共享被$obj1所指对象的内容。即使通过递归clone成员来执行深层复制,也仅在对象图是树形结构时才能安全地工作。如果对象图包含循环引用,则会无限递归,这就是为什么出现堆栈溢出的原因。:-)如果它是有向无环图但不是树形结构,则任何被多次引用的对象都将被副本替换,这可能不是您想要的。

另一方面,unserialize(serialize($obj1))将处理对象图中的循环引用,但在CPU时间和内存方面更加昂贵。


1
对于“浅克隆”加1,以及深度克隆可能存在的问题。 - Mark Baker

3

可以使用克隆关键字来创建一个副本,但是使用这种方法会带来很大的开销,并且无法通过__clone魔术方法定义任何设置或行为。

我建议使用克隆关键字,如果需要进一步研究,请参阅http://php.net/manual/en/language.oop5.cloning.php评论部分的证明,即更改一个对象不会持续到它的克隆体。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接