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 相关文章推荐
IIS+PHP+MySQL+Zend配置 (视频教程)
Dec 13 PHP
dedecms模板标签代码官方参考
Mar 17 PHP
Ajax+PHP边学边练 之五 图片处理
Dec 03 PHP
九个你必须知道而且又很好用的php函数和特点
Aug 08 PHP
php递归使用示例(php递归函数)
Feb 14 PHP
PHP使用range协议实现输出文件断点续传代码实例
Jul 04 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
Feb 23 PHP
php通过两层过滤获取留言内容的方法
Jul 11 PHP
详解PHP中array_rand函数的使用方法
Sep 11 PHP
PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)
May 30 PHP
php nginx 实时输出的简单实现方法
Jan 21 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
Dec 05 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的单引号和双引号 字符串效率
2009/05/27 PHP
php实现html标签闭合检测与修复方法
2015/07/09 PHP
找到了一篇jQuery与Prototype并存的冲突的解决方法
2007/08/29 Javascript
一个简单的JavaScript数据缓存系统实现代码
2010/10/24 Javascript
基于jquery的一个拖拽到指定区域内的效果
2011/09/21 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字
2013/01/23 Javascript
JavaScript的21条基本知识点
2014/03/04 Javascript
JQuery插件Quicksand实现超炫的动画洗牌效果
2015/05/03 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
vue.js加载新的内容(实例代码)
2017/06/01 Javascript
Vue2.0 组件传值通讯的示例代码
2017/08/01 Javascript
详解Angularjs 自定义指令中的数据绑定
2018/07/19 Javascript
微信小程序数据统计和错误统计的实现方法
2019/06/26 Javascript
详解JS函数防抖
2020/06/05 Javascript
[01:16:01]VGJ.S vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[03:02]2020完美世界城市挑战赛(秋季赛)总决赛回顾
2021/03/11 DOTA
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
Python验证码识别处理实例
2015/12/28 Python
python Django框架实现自定义表单提交
2016/03/25 Python
Python中字符串的处理技巧分享
2016/09/17 Python
Python实现的本地文件搜索功能示例【测试可用】
2018/05/30 Python
celery4+django2定时任务的实现代码
2018/12/23 Python
python实现一个猜拳游戏
2020/04/05 Python
python+requests接口自动化框架的实现
2020/08/31 Python
一个不错的HTML5 Canvas多层点击事件监听实例
2014/04/29 HTML / CSS
美国婴童服装市场上的领先品牌:Carter’s
2018/02/08 全球购物
英国名牌男装店:Standout
2021/02/17 全球购物
美容师的职业规划书
2013/12/27 职场文书
物流仓储计划书
2014/01/10 职场文书
支教自我鉴定
2014/01/18 职场文书
2014年前台个人工作总结
2014/11/14 职场文书
2014年挂职干部工作总结
2014/12/06 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书
关于html选择框创建占位符的问题
2021/06/09 HTML / CSS
攻击最高的10只幽灵系神奇宝贝,坚盾剑怪排第一,第五最为可怕
2022/03/18 日漫
Mysql超详细讲解死锁问题的理解
2022/04/01 MySQL