3

因为 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 构建的。

4

2 回答 2

3

我相信公认的方法是序列化和反序列化复合对象

$d = unserialize(serialize($a));
于 2012-12-06T00:00:53.447 回答
1

既然您已经有了 JSON,为什么不直接从 JSON 创建所有对象

另一种“深度克隆”(即不向__clone()对象添加方法)的hacky方法也是:

$object_b = unserialize(serialize($object_a));

或者,因为您正在处理所有嵌套的 stdClass 对象:

$object_b = json_decode(json_encode($object_a));
于 2012-12-06T00:01:33.963 回答