__clone()vs unserialize(serialize())?

Gau*_*rav 4 php serialization clone

随着这个问题的参考,我得到了另一个解决方案是使用

$obj2 = unserialize(serialize($obj1));
Run Code Online (Sandbox Code Playgroud)

代替

$obj2 = clone $obj1;
Run Code Online (Sandbox Code Playgroud)

哪一个更好用?

Jef*_*tin 10

TL;博士版本:使用clone简单对象和树木,unserialize(serialize())为对象的复杂图形.

更长的解释:除非$obj1实现__clone(),表达式clone $obj1将返回一个浅表副本$obj1,但共享指向的对象的内容$obj1.即使__clone()通过递归clone成员来执行深度复制,它也只能在对象图是树的情况下安全地工作.如果对象图包含循环,它将无限递归并且......好吧......这是Stack Overflow的原因.:-)如果它是有向非循环图而不是树,任何多次引用的对象都会将这些多个引用替换为副本,这可能不是您想要的.

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