Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么PHP数组在';s元素是否指定了引用?_Php_Arrays_Reference_Php Internals - Fatal编程技术网

为什么PHP数组在';s元素是否指定了引用?

为什么PHP数组在';s元素是否指定了引用?,php,arrays,reference,php-internals,Php,Arrays,Reference,Php Internals,ref分配数组的元素时,会修改数组的内容: $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) // ← ← ← &

ref分配数组的元素时,会修改数组的内容:

$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)
}
*/
(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

我无法用提供的代码复制此内容。使用PHP5.4.6我已经检查过了,它真的很奇怪。因为没有分配。我已经检查了@Robert can Reproduction,PHP_版本是5.4.15,甚至在PHP中也有相同的行为4@deceze,符号值表中使用的字符令人困惑。。。如何在这一行之后绘制符号值表
$a=1$b=1$c=&$a?(只是需要它作为参考来正确理解你在这里的意思)@deceze。Ic,因此在
$baz=&$foo[0]行之后
,而不是
baz |$1
$1 |“bar”
,你的意思是我们得到
baz,$1 |“bar”
对吗?@Pacerier这是另一种看待它的方式。我不知道说
$baz
指的是这个值,而
$foo[0]
是一个伪链接,也指的是同一个值是否更正确;或者
$baz
$foo[0]
是否都引用引用该值的伪链接。但是,是的,你明白了。@deceze,嗯,我不太明白你所说的“伪链接”是什么意思。。是不是只有
$baz
$foo[0]
是指向同一zval容器的两个不同符号[type='string',value='baz',refcount=2,这几乎是真的]?@Pacerier<代码>$foo[0]
不能是符号
foo
是一个包含数组的符号。该数组的索引
[0]
是对符号表中保存所述zval的条目的引用,其中
条也引用该zval(直接或间接)。
symbol | value
-------+----------------
foo    | array(0 => bar)
baz    | &foo[0]          <-- not supported by symbol table
$a = 1;

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


$b = 1;

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


$c =& a;

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