加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 06:09:43 所属栏目:PHP教程 来源:网络整理
导读: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

<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().

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读