代码如下:
$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
);