克隆stdClass似乎克隆为参考

时间:2014-07-28 20:28:18

标签: php oop

遇到这种情况,我确信我不理解与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属性的引用。所以我需要做一个深度克隆?

1 个答案:

答案 0 :(得分:2)

来自TFM

  

当克隆一个对象时,PHP 5将执行所有的浅层副本   对象的属性。任何引用其他的属性   变量,仍然是参考。

执行:$prototype->someProperty = new stdClass();时,会在堆栈上创建stdClass的对象,并将对它的引用分配给someProperty。克隆$prototype时,克隆的someProperty引用相同的对象。