background image

代码如下:
 

$a

 = 

array

(21, 7); 

$c

 = & 

$a

[0]; 

$b

 = 

$a

$b

[0]= "21"; 

$b

[1]= "7"; 

 
var_dump(

$a

); 

echo

 '<br/>'; 

var_dump(

$b

); 

echo

 '<br/>'; 

var_dump(

$c

); 

echo

 '<br/>'; 

 

// Output: 
// array(2) { [0]=> &string(2) "21" [1]=> int(7) } 
// array(2) { [0]=> &string(2) "21" [1]=> string(1) "7" } 
// string(2) "21" 

 
代码中

$b

跟之前的只是简单的赋值,只是在之前多了一部取第一个元素的引用,但理应

还是拷贝了一个新的数组。可是结果却是对

$b

的修改,同时也改变了

$a

的第一个元素,

而第二个元素没有影响。

从输出中我们还看到了一个不寻常的地方,就是数组第一个元素的类型多一个 &'符号。
而这个正是取引用运算符。也就是说数组的第一个元素已经变成了引用类型。所以赋值时
也是引用拷贝,而非值拷贝。
这个问题十分奇怪,在开发中也造成了许多不必要的困扰,原本以为拷贝出来的数组并
没有跟原数组有关联,但是就因为这意外出现的引用类型,让我在操作时也影响到了原
数组。
我也不清楚这算是 PHP 中的 bug,还是有意如此设计。在网上找了很久也没有对该方便的
相关解释,只有 Float Middle 的《PHP: References To Array Elements Are Risky

 

》和 Symmetric 

Designs 的《Problems w/accessing a PHP 

array

 by reference》里有谈到这个,但是也没有讲原

因。
之后又在 PHP 的 Bug Report 中看到几篇有联系的报告(Bug6417, Bug7412, Bug15025, 
Bug20993)。有些说这是个 Bug,而且已经在后边的版本被修复。具体我也没有明白,只
能避免在数组上使用引用。
更有趣的事情是,如果 unset 那些引用,只留下一个,那么数组元素又会变成不含有引用
的正常类型。
 
代码如下:
 
unset(

$b

); 

unset(

$c

); 

var_dump(

$a

);