gpt4 book ai didi

php - 为什么按值分配给数组元素的变量(在较早的按引用分配之后)会在数组元素更改时更改?

转载 作者:可可西里 更新时间:2023-11-01 13:23:13 24 4
gpt4 key购买 nike

当我运行代码时:

$var[0] = 'a';
$tmp = $var;
$var[0] = 'b';
var_dump($tmp);

输出是:

array(1) { [0]=> string(1) "a" }

当我添加一行如下:

$var[0] = 'a';
$foo = & $var[0]; # added line
$tmp = $var;
$var[0] = 'b';
var_dump($tmp);

输出变成:

array(1) { [0]=> &string(1) "b" }

如果我通过引用数组的元素 $var[0] 来分配变量 $foo,则变量 $tmp 由数组 $var 的值应该像那样改变吗?为什么会这样?

最佳答案

免责声明:我无法找到明确的引用资料,所以我主要在这里进行推断。

常规引用通过符号表工作。创建变量和值时,两者都存储在本地符号表中,如下所示:

$foo = "bar";

+--------+-------+
| symbol | value |
+--------+-------+
| $foo | "bar" |
+--------+-------+

创建引用时,这只是将相同值的另一个符号添加到表中:

$bar =& $foo;

+------------+-------+
| symbol | value |
+------------+-------+
| $foo, $bar | "bar" |
+------------+-------+

数组键的存储方式不同:

$var[0] = 'a';

+--------+-----------------+
| symbol | value |
+--------+-----------------+
| $var | array(0 => 'a') |
+--------+-----------------+

$var 在符号表中有一个条目,但符号表中并未单独引用数组中的值。我推断在创建对值 'a'(存储在 $var[0] 中)的引用时必须发生的是值 'a' 与数组 $var 分开,$var[0] 本身成为对 'a' 新位置的引用存储:

$foo =& $var[0];

+--------+------------------+
| symbol | value |
+--------+------------------+
| $var | array(0 => %REF) |
| $foo | %REF |
| %REF | 'a' |
+--------+------------------+

我猜测符号表的内部实现不允许创建对数组键的直接引用,因此这是创建对数组元素的引用的唯一方法。

因此,当将 $var 复制到 $tmp 时,引用也会随之复制:

$tmp = $var;

+--------+------------------+
| symbol | value |
+--------+------------------+
| $var | array(0 => %REF) |
| $foo | %REF |
| %REF | 'a' |
| $tmp | array(0 => %REF) |
+--------+------------------+

然后,当更改 $var[0] 引用的值时,它会更改 %REF 的值,$tmp$var 引用。

正如我所说,这可能是也可能不是对内部发生的事情的准确解释,但它说明了原理。

关于php - 为什么按值分配给数组元素的变量(在较早的按引用分配之后)会在数组元素更改时更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9424619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com