2012-09-06 45 views
5
$arr = array(1); 
$a = & $arr[0]; 

$arr2 = $arr; 
$arr2[0]++; 

echo $arr[0],$arr2[0]; 

// Output 2,2 

你能帮我一下吗?怎么可能?PHP中的数组引用混淆

+1

你要我们解释一下它是如何工作的? – Wearybands

+1

他只在arr2上递增,并且想知道为什么arr也是递增的 – Dukeatcoding

+1

他意味着这种行为是奇特的,因为他将$ a设置为$ arr的引用,但从不使用$ a。这确实很奇怪。 – Sherlock

回答

7

但是,请注意,数组内部的引用可能是危险的 。使用右侧的 引用进行正常(非引用)分配不会将左侧变为 引用,但在这些正常的 赋值中将保留数组内的引用。这也适用于数组传递值为 的函数调用。

/* 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! */ 
+0

从来不知道这一点。 +1 – Sherlock

+1

RTFM FTW! :-D +1 – DaveRandom

+1

@DaveRandom请缩写RTFM FTW。恐怕我错了;) –

-1

它看起来像$改编[0]和$ ARR2 [0]都指向同一个分配的内存,所以如果你增加的指针之一,INT引脚将在存储

链接Are there pointers in php?被递增

+2

问题是_why_指向相同的分配内存。 – Sherlock

+0

我还没看过,但是,$ arr2 = $ arr;似乎不复制$ arr,但只创建一个新的指针,如C – Dukeatcoding

0
$arr = array(1);//creates an Array ([0] => 1) and assigns it to $arr 
$a = & $arr[0];//assigns by reference $arr[0] to $a and thus $a is a reference of $arr[0]. 
//Here $arr[0] is also replaced with the reference to the actual value i.e. 1 

$arr2 = $arr;//assigns $arr to $arr2 

$arr2[0]++;//increments the referenced value by one 

echo $arr[0],$arr2[0];//As both $aar[0] and $arr2[0] are referencing the same block of memory so both echo 2 

// Output 22