PHP数组修改对象引用行为:是保证的还是随机的?



代码

class Foo {
public $a;
}
$arr = [];
$foo = new Foo();
$foo->a = 1;
$arr[0] = $foo;
$arr[0]->a = 2;
echo $foo->a;

我的测试结果是2。然而,我不确定这种行为是否得到保证或行为是随机的和/或将根据优化器/版本/内存使用/关联或不的状态而改变/…

有保证吗?

注意:我有这个问题的原因是下面的代码将输出1

$arr = [];
$foo = 1;
$arr[0] = $foo;
$arr[0] = 2;
echo $foo;

由于$foo和$arr在内存中指向相同的位置,因此$arr的任何更改也会影响$foo。事实上:$arr[0] === $foo

如果你想从$foo中克隆一个变量,你必须测试:

$arr[0] = clone $foo;

所以$arr中的任何修改都不会影响$foo,反之亦然。