PHP克隆(深度复制)
我想创建对象的深层副本,而不是浅层副本。如果我只是调用PHP克隆(深度复制),php,clone,deep-copy,php-5.6,Php,Clone,Deep Copy,Php 5.6,我想创建对象的深层副本,而不是浅层副本。如果我只是调用clone,我会收到由循环引用引起的内存不足异常。如何在我的magic clone方法中避免循环引用 public function __clone() { foreach($this as $key => $val) { if (is_object($val) || is_array($val) ) { $this->{$key} = unserialize(serialize($
clone
,我会收到由循环引用引起的内存不足异常。如何在我的magic clone方法中避免循环引用
public function __clone() {
foreach($this as $key => $val) {
if (is_object($val) || is_array($val) ) {
$this->{$key} = unserialize(serialize($val));
}
}
}
不太确定如何用PHP编写,但我会,但我认为有一种解决方案可以是将已克隆对象的引用存储在某种类型或列表/数组中,在遇到引用时,使用其克隆引用作为结果。您可以使用spl_object_hash来获取对象的哈希,存储它并使用它跳过已访问的对象。获取精确副本的“唯一”方法是在复制之前删除所有循环引用,进行复制,然后重新创建循环引用,而不会因循环引用而耗尽内存。当然,你必须在复印件和原件上做后者。需要对所涉及的对象有详细的了解。您可能需要使用
spl\u object\u hash()
来确定您以前是否“看到”过对象。myclabs/deep copy
库非常适合于此。一个快速的替代方法是运行$clone=unserialize(序列化($object))代码>,但并不特别令人愉快。