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 相关文章推荐
把从SQL中取出的数据转化成XMl格式
Oct 09 PHP
全文搜索和替换
Oct 09 PHP
PHP数据集构建JSON格式及新数组的方法
Nov 07 PHP
PHP之生成GIF动画的实现方法
Jun 07 PHP
php5.3 goto函数介绍和示例
Mar 21 PHP
WordPress自定义时间显示格式
Mar 27 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
Mar 01 PHP
PHP正则表达式过滤html标签属性(DEMO)
May 04 PHP
PHP图像识别技术原理与实现
Oct 27 PHP
PHP下 Mongodb 连接远程数据库的实例代码
Aug 30 PHP
PHP使用curl_multi实现并发请求的方法示例
Apr 29 PHP
基于laravel where的高级使用方法
Oct 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实现多服务器session共享之NFS共享的方法
2007/03/16 PHP
php 验证码制作(网树注释思想)
2009/07/20 PHP
基于PHP读取csv文件内容的详解
2013/06/18 PHP
php字符串截取函数用法分析
2014/11/25 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
2017/01/12 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
js中根据字数截取字符串,不能截断url
2012/01/12 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
2016/02/17 Javascript
基于JS实现回到页面顶部的五种写法(从实现到增强)
2016/09/03 Javascript
值得分享的bootstrap table实例
2016/09/22 Javascript
JS双击变input框批量修改内容
2016/12/12 Javascript
JS 60秒后重新发送验证码的实例讲解
2017/07/26 Javascript
关于jquery form表单序列化的注意事项详解
2017/08/01 jQuery
jQuery 1.9版本以上的浏览器判断方法代码分享
2017/08/28 jQuery
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
vue中axios的二次封装实例讲解
2019/10/14 Javascript
js实现自动播放匀速轮播图
2020/02/06 Javascript
JS如何实现手机端输入验证码效果
2020/05/13 Javascript
Vue使用v-viewer实现图片预览
2020/10/21 Javascript
python实现的二叉树算法和kmp算法实例
2014/04/25 Python
在Python中使用pngquant压缩png图片的教程
2015/04/09 Python
python实现bucket排序算法实例分析
2015/05/04 Python
python语音识别实践之百度语音API
2018/08/30 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
2019/08/05 Python
Python学习笔记之错误和异常及访问错误消息详解
2019/08/08 Python
Python实现数值积分方式
2019/11/20 Python
Flask和pyecharts实现动态数据可视化
2020/02/26 Python
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
保时捷设计:Porsche Design
2019/03/30 全球购物
下面这个程序执行后会有什么错误或者效果
2014/11/03 面试题
大学自主招生自荐信范文
2014/02/26 职场文书
房屋租赁授权委托书范本
2014/09/20 职场文书
领导欢迎词致辞
2015/01/23 职场文书
会计工作岗位职责
2015/02/03 职场文书
Python音乐爬虫完美绕过反爬
2021/08/30 Python