luinstein 发表于 2012-10-11 13:05:32

PHP控制结构foreach的子元素引用的易错点

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

FROM:http://www.jzxue.com/wangzhankaifa/php/201109/06-8738.html
页: [1]
查看完整版本: PHP控制结构foreach的子元素引用的易错点