• 技术文章 >php教程 >php手册

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

    2016-06-13 11:58:25原创1200
    复制代码 代码如下:


    $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$r = $b[$i]; // 修改了 $r! 相当于 $a[1] = $b[$i];
    }


    为了避免这种情况, 应该在第一个迭代之后, 执行

    复制代码 代码如下:


    unset($r);


    从当前环境中删除 $r 这个变量(引用变量).

    即使不是前面的例子, 在第一个迭代之后, 仍然十分可能再执行类似的语句:

    复制代码 代码如下:


    $r = 123;


    循环变量一般是临时变量, 同一个变量名在代码不同的地方表示不同的东西, 但变量的作用域又存在于循环之外. 这就是这种作用域规则的坏处, 加上”变量不声明即使用”的坏外, 再加上变量无类型的坏处.

    所以, 在 PHP 中使用引用变量, 应该在引用使用完之后, 应该 unset(). 所有变量在使用之前应该先 unset().
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:php中3种方法统计字符串中每种字符的个数并排序 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 学习PHP重定向的三种方法• 关于UEditor编辑器远程图片上传失败的解决办法• php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)• 我自己借用精华区里的MIME类写了一个基本的发信小东东(2)• PHP+DBM的同学录程序(2)_php基础
    1/1

    PHP中文网