遇到这种情况,我确信我不理解与OOP相关的内容,但对我来说并不合理。
为什么以下PHP:
$prototype = new stdClass();
$prototype->someProperty = new stdClass();
$prototype->someProperty->value = 0;
$clone1 = clone $prototype;
$clone2 = clone $prototype;
$clone1->someProperty->value = 200;
$clone2->someProperty->value = 100;
print_r($clone1);
print_r($clone2);
输出:
stdClass Object
(
[someProperty] => stdClass Object
(
[value] => 100
)
)
stdClass Object
(
[someProperty] => stdClass Object
(
[value] => 100
)
)
而不是(正如我所料):
stdClass Object
(
[someProperty] => stdClass Object
(
[value] => 100
)
)
stdClass Object
(
[someProperty] => stdClass Object
(
[value] => 200
)
)
我打赌它与嵌套的stdClass()有关,这是我的头脑;如果我删除someProperty
属性,它的行为与我预期的一样),但据我所知,我创建新对象并且不在任何地方分配任何引用(隐式或由于只需分配变量。)
作为一个附带问题,是否正在创建一个像错误这样的嵌套对象?
更新
更多思考,我是否会沿着正确的方向思考我的克隆确实是克隆,但两者都包含对someProperty
$prototype
属性的引用。所以我需要做一个深度克隆?
答案 0 :(得分:2)
来自TFM:
当克隆一个对象时,PHP 5将执行所有的浅层副本 对象的属性。任何引用其他的属性 变量,仍然是参考。
执行:$prototype->someProperty = new stdClass();
时,会在堆栈上创建stdClass的对象,并将对它的引用分配给someProperty
。克隆$prototype
时,克隆的someProperty
引用相同的对象。