因为 PHP 默认通过引用传递对象,所以我遇到了以下脚本演示的一个小问题:
$a = new stdClass();
$a->b = new stdClass();
$a->b->c = 1;
$d = clone $a;
$a->b->c = 10;
print_r($a);
print_r($d);
有没有办法克隆 stdClass 并克隆它可能包含的任何对象?我知道我可以使用 __clone 方法来防止这种行为,但我的对象是通过 json_decode 构建的。
因为 PHP 默认通过引用传递对象,所以我遇到了以下脚本演示的一个小问题:
$a = new stdClass();
$a->b = new stdClass();
$a->b->c = 1;
$d = clone $a;
$a->b->c = 10;
print_r($a);
print_r($d);
有没有办法克隆 stdClass 并克隆它可能包含的任何对象?我知道我可以使用 __clone 方法来防止这种行为,但我的对象是通过 json_decode 构建的。
我相信公认的方法是序列化和反序列化复合对象
$d = unserialize(serialize($a));
既然您已经有了 JSON,为什么不直接从 JSON 创建所有对象
另一种“深度克隆”(即不向__clone()
对象添加方法)的hacky方法也是:
$object_b = unserialize(serialize($object_a));
或者,因为您正在处理所有嵌套的 stdClass 对象:
$object_b = json_decode(json_encode($object_a));