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实现采集程序原理和简单示例代码
Mar 18 PHP
兼容PHP5的PHP目录管理函数库
Jul 10 PHP
PHP HTML代码串截取代码
Dec 29 PHP
php cli模式学习(PHP命令行模式)
Jun 03 PHP
解析isset与is_null的区别
Aug 09 PHP
codeigniter集成ucenter1.6双向通信的解决办法
Jun 12 PHP
PHP验证码生成原理和实现
Jan 24 PHP
php检测mysql表是否存在的方法小结
Jul 20 PHP
弹出模态框modal的实现方法及实例
Sep 19 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
Mar 11 PHP
php回调函数处理数组操作示例
Apr 13 PHP
使用php的mail()函数实现发送邮件功能
Jun 03 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
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
php调用c接口无错版介绍
2014/03/11 PHP
最常用的8款PHP调试工具
2014/07/06 PHP
ThinkPHP中的三大自动简介
2014/08/22 PHP
php微信支付之APP支付方法
2015/03/04 PHP
PHP浮点数的一个常见问题
2016/03/10 PHP
PHP创建/删除/复制文件夹、文件
2016/05/03 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
2016/07/25 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
动态刷新 dorado树的js代码
2009/06/12 Javascript
javascript 函数速查表
2010/02/07 Javascript
jQuery插件实现文字无缝向上滚动效果代码
2016/02/25 Javascript
详解JavaScript中|单竖杠运算符的使用方法
2016/05/23 Javascript
js仿小米官网图片轮播特效
2016/09/29 Javascript
jquery与ajax获取特殊字符实例详解
2017/01/08 Javascript
bootstrap fileinput 插件使用项目总结(经验)
2017/02/22 Javascript
利用Jasmine对Angular进行单元测试的方法详解
2017/06/12 Javascript
Vue修改项目启动端口号方法
2019/11/07 Javascript
python列表去重的二种方法
2014/02/14 Python
python实现k均值算法示例(k均值聚类算法)
2014/03/16 Python
Python利用ElementTree模块处理XML的方法详解
2017/08/31 Python
使用python根据端口号关闭进程的方法
2018/11/06 Python
python使用socket 先读取长度,在读取报文内容示例
2019/09/26 Python
TensorFlow:将ckpt文件固化成pb文件教程
2020/02/11 Python
pytorch实现MNIST手写体识别
2020/02/14 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
2020/02/20 Python
Python库skimage绘制二值图像代码实例
2020/04/10 Python
python下载的库包存放路径
2020/07/27 Python
使用纯 CSS 创作一个脉动 loader效果的源码
2018/09/28 HTML / CSS
HTML5 背景的显示区域实现
2020/07/09 HTML / CSS
英国知名化妆品网站:Revolution Beauty(原TAM Beauty)
2018/02/28 全球购物
英国复古服装购物网站:Collectif
2019/10/30 全球购物
教师校本培训方案
2014/02/26 职场文书
给领导的感谢信范文
2015/01/23 职场文书
郭明义观后感
2015/06/08 职场文书