根据这个问题的参考,我找到了另一个解决方案:使用“clone”方法。
替代
$obj2 = unserialize(serialize($obj1));
替代
$obj2 = clone $obj1;
哪一个更好用?
$obj2 = unserialize(serialize($obj1));
$obj2 = clone $obj1;
哪一个更好用?
简短版:对于简单对象和树形结构,可以使用clone
。对于复杂的对象图,可以使用unserialize(serialize())
。
详细说明:如果$obj1
没有实现__clone()
方法,则表达式clone $obj1
将返回$obj1
的浅拷贝,但共享被$obj1
所指对象的内容。即使通过递归clone
成员来执行深层复制,也仅在对象图是树形结构时才能安全地工作。如果对象图包含循环引用,则会无限递归,这就是为什么出现堆栈溢出的原因。:-)如果它是有向无环图但不是树形结构,则任何被多次引用的对象都将被副本替换,这可能不是您想要的。
另一方面,unserialize(serialize($obj1))
将处理对象图中的循环引用,但在CPU时间和内存方面更加昂贵。
可以使用克隆关键字来创建一个副本,但是使用这种方法会带来很大的开销,并且无法通过__clone魔术方法定义任何设置或行为。
我建议使用克隆关键字,如果需要进一步研究,请参阅http://php.net/manual/en/language.oop5.cloning.php评论部分的证明,即更改一个对象不会持续到它的克隆体。