通过对象引用行为修改 PHP 数组:是保证还是随机? [复制]

Posted

技术标签:

【中文标题】通过对象引用行为修改 PHP 数组:是保证还是随机? [复制]【英文标题】:PHP array modification by object reference behavior: is it guaranteed or random? [duplicate] 【发布时间】:2021-12-02 12:20:47 【问题描述】:

这是代码

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;

【问题讨论】:

【参考方案1】:

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

如果你想从 $foo 克隆一个 var,你必须测试这个:

$arr[0] = clone $foo;

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

【讨论】:

以上是关于通过对象引用行为修改 PHP 数组:是保证还是随机? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

PHP对象到底是值传递还是引用传递

PHP是不是优化数组类型的函数参数,而不是通过引用显式传递,当它们没有被修改时?

如何在 PHP 中克隆对象数组?

使用具有特定对象引用的随机数创建数组

JavaScript - 通过引用传递时清空数组/对象问题

PHP 数组的拷贝是按值传递 or 按引用传递