PHP 中使用 foreach 和引用导致程序 BUG 的问题介绍
PHP 引用有些类似 C 语言指针, 但一些重要的特性和 C 语言指针不一样, 如果不注意, 会导
致程序
BUG.
foreach
操作的是数组或对象的拷贝, 但 PHP5, 可以使用引用操作对象元素本
身
代码如下
:
$a
=
array
(1, 2);
$b
=
array
(11, 12);
foreach
(
$a
as
&
$r
){
}
foreach
(
$b
as
$r
){
}
echo
$a
[1];
// 输出 12
两个的循环的本意可能是
: 第一个循环需要在循环中修改元素的内容, 所以使用引用; 但第
二个循环只是把
$r
当作一个临时变量. 可是, 为什么
$a
[1] 的值发生了改变呢?
当对
$a
的迭代完成后,
$r
是
$a
[1] 的引用, 改变
$r
的值, 就是改变
$a
[1]. 这时, 你可以会奇怪,
代码中并没有修改
$r
, 也没有修改
$a
[1] 呀?
其实
,
foreach
是操作的是数组的拷贝, 所以, 后一个迭代相当于:
代码如下
:
for
(
$i
=0;
$i
<
count
(
$b
);
$i
++){
$r
=
$b
[
$i
];
// 修改了 $r! 相当于 $a[1] = $b[$i];
}
为了避免这种情况
, 应该在第一个迭代之后, 执行
代码如下
:
unset(
$r
);
从当前环境中删除
$r
这个变量(引用变量).
即使不是前面的例子
, 在第一个迭代之后, 仍然十分可能再执行类似的语句:
代码如下
:
$r
= 123;
循环变量一般是临时变量
, 同一个变量名在代码不同的地方表示不同的东西, 但变量的作用
域又存在于循环之外
. 这就是这种作用域规则的坏处, 加上”变量不声明即使用”的坏外, 再加