gpt4 book ai didi

php - 为什么当 PHP 数组的元素是引用分配时它会被修改?

转载 作者:行者123 更新时间:2023-12-04 17:51:47 27 4
gpt4 key购买 nike

当对数组的元素进行引用分配时,数组的内容会被修改:

$arr = array(100, 200);
var_dump($arr);
/* shows:
array(2) {
[0]=>
int(100) // ← ← ← int(100)
[1]=>
int(200)
}
*/

$r = &$arr[0];
var_dump($arr);
/* shows:
array(2) {
[0]=>
&int(100) // ← ← ← &int(100)
[1]=>
int(200)
}
*/

Live run. (Zend 引擎可以正常工作,而 HHVM 显示“进程已退出,代码为 153”。)

为什么要修改元素?

为什么我们看到的是 &int(100) 而不是 int(100)

这看起来很奇怪。对这种奇怪现象的解释是什么?

最佳答案

我之前回答过这个问题,但现在找不到答案。我相信它是这样的:

引用只是符号表中相同值的“附加”条目。符号表只能有它指向的,不能有值中的值。符号表不能指向数组中的索引,它只能指向一个值。因此,当您想要引用数组索引时,该索引处的值会从数组中取出,为它创建一个符号,数组中的槽会获得对该值的引用:

$foo = array('bar');

symbol | value
-------+----------------
foo | array(0 => bar)

$baz =& $foo[0];

symbol | value
-------+----------------
foo | array(0 => $1)
baz | $1
$1 | bar <-- pseudo entry for value that can be referenced

因为这是不可能的:

symbol | value
-------+----------------
foo | array(0 => bar)
baz | &foo[0] <-- not supported by symbol table

上面的 $1 只是一个任意选择的“伪”名称,它与实际的 PHP 语法或内部实际引用该值的方式无关。

按照评论中的要求,符号表通常如何处理引用:

$a = 1;

symbol | value
-------+----------------
a | 1


$b = 1;

symbol | value
-------+----------------
a | 1
b | 1


$c =& a;

symbol | value
-------+----------------
a, c | 1
b | 1

关于php - 为什么当 PHP 数组的元素是引用分配时它会被修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17528280/

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