数组引用的奇怪行为

时间:2014-09-04 16:04:21

标签: php

<?php
 $arr = array(1);
 $a =& $arr[0];
 $arr2 = $arr;
 $arr2[0]++;

 var_dump($arr);
 var_dump($a);
 var_dump($arr2);
?>

输出:
2
2
2

$ arr的元素在$ arr2的increment元素之后被更改,尽管assign是pass-by-value而不是pass-by-reference。在将引用$ a定义为$ arr [0]之后会发生这种情况。那么为什么这个定义修改了源数组并插入值而不是初始值呢?在C ++之后,对我来说看起来不合逻辑。是Bug还是记录的功能?我发现这个link并没有在php 5.5手册中找到解释,在手册中确实会发生这种情况。

1 个答案:

答案 0 :(得分:1)

PHP: What References Do

  

但请注意,数组中的引用具有潜在危险。使用右侧的引用执行正常(非引用)赋值不会将左侧转换为引用,但是在这些正常赋值中内部的引用保留。这也适用于通过值传递数组的函数调用。例如:

<?php
/* Assignment of scalar variables */
$a = 1;
$b =& $a;
$c = $b;
$c = 7; //$c is not a reference; no change to $a or $b

/* Assignment of array variables */
$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) */
/* The contents of $arr are changed even though it's not a reference! */
?>
  

换句话说,数组的引用行为是逐个元素定义的;单个元素的引用行为与数组容器的引用状态分离。