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 相关文章推荐
在WIN98下以apache模块方式安装php
Oct 09 PHP
php 文件上传系统手记
Oct 26 PHP
php cout&amp;lt;&amp;lt;的一点看法
Jan 24 PHP
JoshChen_php新手进阶高手不可或缺的规范介绍
Aug 16 PHP
用PHP实现弹出消息提示框的两种方法
Dec 17 PHP
codeigniter集成ucenter1.6双向通信的解决办法
Jun 12 PHP
PHP使用GIFEncoder类处理gif图片实例
Jul 01 PHP
php去除头尾空格的2种方法
Mar 16 PHP
PHP统一页面编码避免乱码问题
Apr 09 PHP
PHP结合jQuery实现找回密码
Jul 22 PHP
PHP类的封装与继承详解
Sep 29 PHP
PHP登录验证功能示例【用户名、密码、验证码、数据库、已登陆验证、自动登录和注销登录等】
Feb 25 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 来访国内外IP判断代码并实现页面跳转
2009/12/18 PHP
php 根据url自动生成缩略图并处理高并发问题
2014/01/23 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
PHP针对JSON操作实例分析
2015/01/12 PHP
PHP实现从上往下打印二叉树的方法
2018/01/18 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
2019/09/05 PHP
基于jquery的loading效果实现代码
2010/11/05 Javascript
JavaScript面向对象(极简主义法minimalist approach)
2012/07/17 Javascript
Bootstrap媒体对象的实现
2016/05/01 Javascript
原生js实现自由拖拽弹窗代码demo
2016/06/29 Javascript
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
微信小程序支付及退款流程详解
2017/11/30 Javascript
js读取本地文件的实例
2017/12/22 Javascript
vue better-scroll插件使用详解
2018/01/25 Javascript
Electron 如何调用本地模块的方法
2019/02/01 Javascript
Vue Echarts实现可视化世界地图代码实例
2019/05/07 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
2020/04/29 Javascript
Python面向对象编程基础解析(二)
2017/10/26 Python
利用scrapy将爬到的数据保存到mysql(防止重复)
2018/03/31 Python
浅谈python 导入模块和解决文件句柄找不到问题
2018/12/15 Python
python 调用有道api接口的方法
2019/01/03 Python
Python+OpenCV采集本地摄像头的视频
2019/04/25 Python
python 通过可变参数计算n个数的乘积方法
2019/06/13 Python
python实现ip代理池功能示例
2019/07/05 Python
python字符串替换re.sub()方法解析
2019/09/18 Python
Python字典中的值为列表或字典的构造实例
2019/12/16 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
2020/12/10 Python
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
澳大利亚领先的优质葡萄酒拍卖会:Langton’s Fine Wines
2019/03/24 全球购物
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
客服服务心得体会
2013/12/30 职场文书
医药学专业大学生职业生涯规划书论文
2014/01/21 职场文书
收银员的岗位职责范本
2014/02/04 职场文书
调解书格式范本
2015/05/20 职场文书
煤矿安全学习心得体会
2016/01/18 职场文书
JavaScript中关于预编译、作用域链和闭包的理解
2021/03/31 Javascript