1

今天我在阅读PHP 官方手册页上的What Reference Do文章,发现以下代码:

<?php
$arr = array(1);
$a =& $arr[0]; //$a and $arr[0] are in the same reference set
$arr2 = $arr; //not an assignment-by-reference!
$arr2[0]++;
/* $a == 2, $arr == array(2) */

这就是手册中有关此代码的内容:

数组内的引用有潜在的危险。使用右侧的引用进行普通(非引用)赋值不会将左侧变为引用,但数组内的引用会保留在这些普通赋值中。这也适用于数组按值传递的函数调用。

有人能解释一下为什么在执行代码后我们的 $a 和 $arr 等于 2 吗?

4

2 回答 2

1

做一个var_dump($arr);,你会看到问题。$arr[0]会有一个&int type.

  • 这意味着$arr[0]成为对值的引用。
  • 并且该$arr数组实际上将引用作为其第一个值。
  • 当您复制数组时,引用将被继承,因为第一个元素将继续作为引用,并且仍将修改引用的值。

这是一个数组的事情。看起来真的很奇怪,但一旦你理解它,它就很有意义......就像 PHP 一样有意义 :)

PS:这种行为就是为什么call_user_func_array()可以将一个array()引用作为它的参数,并允许您调用接受引用参数的函数。

于 2012-11-01T17:37:00.527 回答
1

也许这会让它更清楚:

$arr = array(1,1);
$a =& $arr[0]; //$a and $arr[0] are in the same reference set
$arr2 = $arr; //not an assignment-by-reference!
$arr2[0]++;
$arr2[1]++;
/* $a == 2, $arr == array(2) */
var_dump($arr);
//outputs array(2) { [0]=> &int(2) [1]=> int(1) } 

值增加的原因是因为the reference inside the array is preserved in the normal assignment. $arr2[0],$arr[0]现在$a都引用相同的值,即使$arr2$arr. 注意如何$arr2[1]++不增加$arr[1]

于 2012-11-01T17:34:36.933 回答