服务器之家

服务器之家 > 正文

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

时间:2020-01-08 17:27     来源/作者:PHP教程网

代码如下:


$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; 


循环变量一般是临时变量, 同一个变量名在代码不同的地方表示不同的东西, 但变量的作用域又存在于循环之外. 这就是这种作用域规则的坏处, 加上”变量不声明即使用”的坏外, 再加上变量无类型的坏处. 

标签:

相关文章

热门资讯

玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情 2019-06-22
配置IIS网站web服务器的安全策略配置解决方案
配置IIS网站web服务器的安全策略配置解决方案 2019-05-23
Nginx服务器究竟是怎么执行PHP项目
Nginx服务器究竟是怎么执行PHP项目 2019-05-24
返回顶部