background image

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; 

 
循环变量一般是临时变量

, 同一个变量名在代码不同的地方表示不同的东西, 但变量的作用

域又存在于循环之外

. 这就是这种作用域规则的坏处, 加上”变量不声明即使用”的坏外, 再加