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 相关文章推荐
Discuz 6.0+ 批量注册用户名
Sep 13 PHP
PHP iconv 函数转gb2312的bug解决方法
Oct 11 PHP
PHP冒泡排序算法代码详细解读
Jul 17 PHP
php.ini 配置文件的深入解析
Jun 17 PHP
php上传大文件失败的原因及应对策略
Oct 20 PHP
基于PHP给大家讲解防刷票的一些技巧
Nov 18 PHP
PHP HTTP 认证实例详解
Nov 03 PHP
详谈PHP面向对象中常用的关键字和魔术方法
Feb 04 PHP
redirect_uri参数错误的解决方法(必看)
Feb 16 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
May 31 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
Oct 14 PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
Apr 10 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下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
php 解决扫描二维码下载跳转问题
2017/01/13 PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
2019/10/17 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
如何用js控制css中的float的代码
2007/08/16 Javascript
JavaScript 继承详解(二)
2009/07/13 Javascript
javascript面向对象之二 命名空间
2011/02/08 Javascript
jQuery实现用方向键控制层的上下左右移动
2013/01/13 Javascript
js+html+css实现鼠标移动div实例
2013/01/30 Javascript
jquery ajax post提交数据乱码
2013/11/05 Javascript
jQuery分别获取选中的复选框值的示例
2014/06/17 Javascript
javascript下拉框选项单击事件的例子分享
2015/03/04 Javascript
js实现常用排序算法
2016/08/09 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
2016/10/14 Javascript
前端面试知识点锦集(JavaScript篇)
2016/12/28 Javascript
bootstrap制作jsp页面(根据值让table显示选中)
2017/01/05 Javascript
Bootstrap表单控件学习使用
2017/03/07 Javascript
JavaScript获取URL参数的方法之一
2017/03/24 Javascript
讲解vue-router之什么是嵌套路由
2018/05/28 Javascript
koa源码中promise的解读
2018/11/13 Javascript
JavaScript时间与时间戳的转换操作实例分析
2018/12/07 Javascript
js实现电灯开关效果
2021/01/19 Javascript
Vue 数据响应式相关总结
2021/01/28 Vue.js
[02:16]DOTA2英雄基础教程 干扰者
2014/01/15 DOTA
[28:07]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第二场 12.13
2020/12/17 DOTA
PyTorch的自适应池化Adaptive Pooling实例
2020/01/03 Python
Python基于stuck实现scoket文件传输
2020/04/02 Python
Django自定义列表 models字段显示方式
2020/04/03 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
2020/04/26 Python
Pytorch生成随机数Tensor的方法汇总
2020/09/09 Python
关于iframe跨域使用postMessage的实现
2019/10/29 HTML / CSS
美国受信赖的教育产品供应商:Nest Learning
2018/06/14 全球购物
BASIC HOUSE官方旗舰店:韩国著名的服装品牌
2018/09/27 全球购物
sleep()方法和wait()方法的区别是什么
2012/11/17 面试题
党的群众路线教育实践活动动员会主持词
2014/03/20 职场文书
北京故宫的导游词
2015/01/31 职场文书