PHP中使用foreach和引用导致程序BUG的问题介绍

2015-01-24信息快讯网

PHP 引用有些类似 C 语言指针, 但一些重要的特性和 C 语言指针不一样, 如果不注意, 会导致程序 BUG. foreach 操作的是数组或对象的拷贝, 但 PHP5, 可以使用引用操作对象元素本身

 
$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().
探讨:如何使用PhpDocumentor生成文档
使用Sphinx对索引进行搜索
PHP垃圾回收机制引用计数器概念分析
解析在PHP中使用全局变量的几种方法
关于crontab的使用详解
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
解析在apache里面给php写虚拟目录的详细方法
探讨:php中在foreach中使用foreach ($arr as &$value) 这种类型的解释
PHP中的函数-- foreach()的用法详解
解析coreseek for sphinx的使用
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
浅析使用Turck-mmcache编译来加速、优化PHP代码
解析smarty模板中类似for的功能实现
ubuntu下编译安装xcache for php5.3 的具体操作步骤
深入解析PHP的引用计数机制
php引用返回与取消引用的详解
php中将字符串转为HTML的实体引用的一个类
PHP数组传递是值传递而非引用传递概念纠正
通过缓存数据库结果提高PHP性能的原理介绍
php循环语句 for()与foreach()用法区别介绍
Windows下部署Apache+PHP+MySQL运行环境实战
PHP系列学习之日期函数使用介绍
通过5个php实例细致说明传值与传引用的区别
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
PHP文章采集URL补全函数(FormatUrl)
PHP中使用unset销毁变量并内存释放问题
php中根据变量的类型 选择echo或dump
apache+codeigniter 通过.htcaccess做动态二级域名解析
php中使用接口实现工厂设计模式的代码
php中jQuery插件autocomplate的简单使用笔记
php面向对象 字段的声明与使用
PHP number_format() 函数定义和用法
php引用地址改变变量值的问题
奇怪的PHP引用效率问题分析
php地址引用(php地址引用的效率问题)
for循环连续求和、九九乘法表代码
PHP循环语句笔记(foreach,list)
使ecshop模板中可引用常量的实现方法
©2014-2024 dbsqp.com