PHP中使用foreach和引用导致程序BUG的问题介绍

前端之家收集整理的这篇文章主要介绍了PHP中使用foreach和引用导致程序BUG的问题介绍前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

<div class="codetitle"><a style="CURSOR: pointer" data="17939" class="copybut" id="copybut17939" onclick="doCopy('code17939')"> 代码如下:

<div class="codebody" id="code17939">
$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 是操作的是数组的拷贝,所以,后一个迭代相当于:
<div class="codetitle"><a style="CURSOR: pointer" data="9653" class="copybut" id="copybut9653" onclick="doCopy('code9653')"> 代码如下:
<div class="codebody" id="code9653">
for($i=0; $i<count($b); $i++){
$r = $b[$i]; // 修改了 $r! 相当于 $a[1] = $b[$i];
}

为了避免这种情况,应该在第一个迭代之后,执行
<div class="codetitle"><a style="CURSOR: pointer" data="87627" class="copybut" id="copybut87627" onclick="doCopy('code87627')"> 代码如下:
<div class="codebody" id="code87627">
unset($r);

从当前环境中删除 $r 这个变量(引用变量). 即使不是前面的例子,在第一个迭代之后,仍然十分可能再执行类似的语句:
<div class="codetitle"><a style="CURSOR: pointer" data="27148" class="copybut" id="copybut27148" onclick="doCopy('code27148')"> 代码如下:
<div class="codebody" id="code27148">
$r = 123;

循环变量一般是临时变量,同一个变量名在代码不同的地方表示不同的东西,但变量的作用域又存在于循环之外. 这就是这种作用域规则的坏处,加上”变量不声明即使用”的坏外,再加上变量无类型的坏处. 所以,在 PHP 中使用引用变量,应该在引用使用完之后,应该 unset(). 所有变量在使用之前应该先 unset().

原文链接:https://www.f2er.com/php/27025.html
foreachforeachforeach

猜你在找的PHP相关文章