Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP克隆(深度复制)_Php_Clone_Deep Copy_Php 5.6 - Fatal编程技术网

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)),但并不特别令人愉快。