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


Posted in PHP onSeptember 05, 2012
$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().

PHP 相关文章推荐
PHP has encountered an Access Violation
Jan 15 PHP
PHP入门学习的几个不错的实例代码
Jul 13 PHP
php中通过Ajax如何实现异步文件上传的代码实例
May 07 PHP
php中防止伪造跨站请求的小招式
Sep 02 PHP
win7+apache+php+mysql环境配置操作详解
Jun 10 PHP
解析php通过cookies获取远程网页的指定代码
Jun 25 PHP
php中字符集转换iconv函数使用总结
Oct 11 PHP
yii2.0之GridView自定义按钮和链接用法
Dec 15 PHP
SESSION存放在数据库用法实例
Aug 08 PHP
详解Laravel视图间共享数据与视图Composer
Aug 04 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
Apr 10 PHP
PHP下 Mongodb 连接远程数据库的实例代码
Aug 30 PHP
php循环语句 for()与foreach()用法区别介绍
Sep 05 #PHP
PHP手机号码归属地查询代码(API接口/mysql)
Sep 04 #PHP
PHP获取用户的浏览器与操作系统信息的代码
Sep 04 #PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
Sep 04 #PHP
PHP中“简单工厂模式”实例代码讲解
Sep 04 #PHP
通过php快速统计某个数据库中每张表的数据量
Sep 04 #PHP
比较discuz和ecshop的截取字符串函数php版
Sep 03 #PHP
You might like
php公用函数列表[正则]
2007/02/22 PHP
PHP在不同页面间传递Json数据示例代码
2013/06/08 PHP
最新版本PHP 7 vs HHVM 多角度比较
2016/02/14 PHP
Smarty变量用法详解
2016/05/11 PHP
浅析php中array_map和array_walk的使用对比
2016/11/20 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
简单三步,搞掂内存泄漏
2007/03/10 Javascript
javascript 添加和移除函数的通用方法
2009/10/20 Javascript
关于COOKIE个数与大小的问题
2011/01/17 Javascript
新发现一个骗链接的方法(js读取cookies)
2012/01/11 Javascript
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
将Datatable转化成json发送前台实现思路
2013/09/06 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
原生js与jQuery实现简单的tab切换特效对比
2015/07/30 Javascript
JavaScript常用本地对象小结
2016/03/28 Javascript
jQuery Ajax 实现在html页面实时显示用户登录状态
2016/12/30 Javascript
JavaScript之排序函数_动力节点Java学院整理
2017/06/30 Javascript
bootstrap fileinput实现文件上传功能
2017/08/23 Javascript
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
原生js实现拖拽功能基本思路详解
2018/04/18 Javascript
Python中内建函数的简单用法说明
2016/05/05 Python
详解Python中表达式i += x与i = i + x是否等价
2017/02/08 Python
python-itchat 获取微信群用户信息的实例
2019/02/21 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
科尔士百货公司官网:Kohl’s
2016/07/11 全球购物
给全校老师的建议书
2014/03/13 职场文书
财产保全担保书范文
2014/04/01 职场文书
土地转让协议书
2014/04/15 职场文书
党日活动总结
2014/05/07 职场文书
三八妇女节演讲稿
2014/05/27 职场文书
教师求职信怎么写
2015/03/20 职场文书
2015年终个人政治思想工作总结
2015/11/24 职场文书
2016年感恩父亲节活动总结
2016/04/01 职场文书
公司年会晚会开幕词
2019/04/02 职场文书
《辉夜大小姐想让我告白》第三季正式预告
2022/03/20 日漫