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

 更新时间:2012年09月05日 21:35:47   作者:  
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;

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

所以, 在 PHP 中使用引用变量, 应该在引用使用完之后, 应该 unset(). 所有变量在使用之前应该先 unset().

相关文章

  • Thinkphp5和Thinkphp3的区别对比以及单字母函数对应的助手函数

    Thinkphp5和Thinkphp3的区别对比以及单字母函数对应的助手函数

    TP5在很多方面相比TP3升级和提升。尽管TP3已经有一定的市场和用户群体,但新项目还是建议使用TP5。thinkphp3.2中一些快捷大写单字母函数,比如 U(),I() , C(),M() , D() , W()等,这些在thinkphp5 中已经不再使用,而是改用助手函数来代替。
    2023-07-07
  • PHP 防恶意刷新实现代码

    PHP 防恶意刷新实现代码

    经常会做统计的时候会遇到恶意刷新的人,用此来增加统计数量,以下PHP代码实现了防恶意刷新的效果,上代码
    2010-05-05
  • PHP数据库操作二:memcache用法分析

    PHP数据库操作二:memcache用法分析

    这篇文章主要介绍了PHP数据库操作memcache用法,结合实例形式详细分析了memcache的下载、安装、配置及相关使用技巧,需要的朋友可以参考下
    2017-08-08
  • PHP连接数据库实现注册页面的增删改查操作

    PHP连接数据库实现注册页面的增删改查操作

    这篇文章主要介绍了PHP连接数据库实现注册页面的增删改查操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • php版微信公众平台回复中文出现乱码问题的解决方法

    php版微信公众平台回复中文出现乱码问题的解决方法

    这篇文章主要介绍了php版微信公众平台回复中文出现乱码问题的解决方法,涉及php字符串编码转换的相关操作技巧,需要的朋友可以参考下
    2016-09-09
  • PHP实现合并discuz用户

    PHP实现合并discuz用户

    本文给大家分享的是如何实现整合DISCUZ用户的方法,第一种比较直接,适合只保留一个论坛的情形,第二个比较完善,适合两个论坛同时运营,小伙伴们根据自己的情况,自由选择。
    2015-08-08
  • PHP利用正则表达式将相对路径转成绝对路径的方法示例

    PHP利用正则表达式将相对路径转成绝对路径的方法示例

    这篇文章主要介绍了PHP利用正则表达式将相对路径转成绝对路径的方法,文中给出了详细的示例代码,大家可以整合成一个方法,在需要的地方调用,非常的不错。需要的朋友们下面来一起看看吧。
    2017-02-02
  • php去掉文件前几行的方法

    php去掉文件前几行的方法

    这篇文章主要介绍了php去掉文件前几行的方法,以去除lrc文件前几行为例分析了php操作文件的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • php使用strtotime技巧示例解惑

    php使用strtotime技巧示例解惑

    这篇文章主要为大家介绍了php使用strtotime技巧示例解惑,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • php静态编译swoole-cli并调用rust的动态链接库

    php静态编译swoole-cli并调用rust的动态链接库

    这篇文章主要为大家介绍了静态编译swoole-cli并调用rust的动态链接库实现步骤详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07

最新评论