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写入WRITE编码为UTF8的文件的实现代码
Jul 07 PHP
解析在zend Farmework下如何创立一个FORM表单
Jun 28 PHP
PHP原生函数一定好吗?
Dec 08 PHP
php实现excel中rank函数功能的方法
Jan 20 PHP
PHP判断一个字符串是否是回文字符串的方法
Mar 23 PHP
php基于Snoopy解析网页html的方法
Jul 09 PHP
详解Yii2高级版引入bootstrap.js的一个办法
Mar 21 PHP
Laravel实现表单提交
May 07 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 PHP
Laravel 实现密码重置功能
Feb 23 PHP
详解laravel安装使用Passport(Api认证)
Jul 27 PHP
PHP实现15位身份证号转18位的方法分析
Oct 16 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 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
2006/10/09 PHP
第九节--绑定
2006/11/16 PHP
PHP获取一段文本显示点阵宽度和高度的方法
2015/03/12 PHP
JQuery 风格的HTML文本转义
2009/07/01 Javascript
使用JQUERY Tabs插件宿主IFRAMES
2010/01/01 Javascript
Javascript 赋值机制详解
2014/11/23 Javascript
JavaScript获取对象在页面中位置坐标的方法
2016/02/03 Javascript
JS实现响应鼠标点击动画渐变弹出层效果代码
2016/03/25 Javascript
JS框架之vue.js(深入三:组件1)
2016/09/29 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
2016/10/12 Javascript
基于ajax与msmq技术的消息推送功能实现代码
2016/12/26 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
Angular实现模版驱动表单的自定义校验功能(密码确认为例)
2018/05/17 Javascript
node上的redis调用优化示例详解
2018/10/30 Javascript
js实现二级联动简单实例
2020/01/11 Javascript
Javascript var变量删除原理及实现
2020/08/26 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
[26:21]浴火之凤-TI4世界冠军Newbee战队纪录片
2014/08/07 DOTA
在Python中使用mechanize模块模拟浏览器功能
2015/05/05 Python
简单介绍Python的Django框架加载模版的方式
2015/07/20 Python
Python编程中的异常处理教程
2015/08/21 Python
Python中内置数据类型list,tuple,dict,set的区别和用法
2015/12/14 Python
听歌识曲--用python实现一个音乐检索器的功能
2016/11/15 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
HTML里显示pdf、word、xls、ppt的方法示例
2020/04/14 HTML / CSS
VLAN和VPN有什么区别?分别实现在OSI的第几层?
2014/12/23 面试题
应届大学生自荐信
2013/12/05 职场文书
设计总监岗位职责
2013/12/07 职场文书
学校安全检查制度
2014/01/27 职场文书
办公室主任主任岗位责任制
2014/02/11 职场文书
环保倡议书50字
2014/05/15 职场文书
大学新闻系自荐书
2014/05/31 职场文书
鸟的天堂导游词
2015/01/31 职场文书
学校党员干部承诺书
2015/05/04 职场文书
超市员工管理制度
2015/08/06 职场文书
Java 超详细讲解数据结构中的堆的应用
2022/04/02 Java/Android