Some reminiscences, some memories

Just another boring day
« google 挂了?
Excel 下拉菜单/下拉列表动画教程 »

3

Jul

PHP —— 为什么不要在 foreach 中使用变量引用

mikespook 

最近在浏览同事之前写的代码的时候,发现大量的变量引用使用在 foreach 中:

1 <?php

2 $a = array( ‘a‘, ‘b‘, ‘c‘, ‘d‘);

3 foreach($a as &$v) {

4 $v = $v . ‘_bar‘;

5 }

6 var_dump($a);

这种写法有个好处,就是可以直接通过改变引用变量 $v 的值,来直接改变数组的值。但是显然,这里会带来一个问题:

1 <?php

2 $a = array( ‘a‘, ‘b‘, ‘c‘, ‘d‘);

3 foreach($a as &$v) {

4 $v = $v . ‘_bar‘;

5 }

6 $v = ‘foobar‘; 7 var_dump($a);

通常 foreach 变量都只希望是一个作用域在 foreach 内部的局部临时变量。但是当不慎在后面用了同名的临时变量时,数组的内容会不预期的被改变。就如同上面的代码那样,最终结果 $a[3] = ‘foobar’ 而不是预期的 $a[3] = ‘d_bar’。这对于程序的正确执行时一个隐患,不能让程序的正确性维系在程序员足够细心的不使用重名临时变量,这一线上。

解决方法有两种。

第一种,直接使用数组的键值来修改数组内容:

1 <?php

2 $a = array( ‘a‘, ‘b‘, ‘c‘, ‘d‘);

3 foreach($a as $k => $v) {

4 $a[$k] = $v . ‘_bar‘;

5 }

6 $v = ‘foobar‘;

7 var_dump($a);

第二种,注销掉 foreach 中使用的临时变量:

1 <?php

2 $a = array( ‘a‘, ‘b‘, ‘c‘, ‘d‘);

3 foreach($a as &$v) {

4 $v = $v . ‘_bar‘;

5 }

6 unset($v);

7 $v = ‘foobar‘;

8 var_dump($a);

This entry was posted on Thursday, July 3rd, 2008 at 02:14 and is filed under PHP. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

One Response to “ PHP —— 为什么不要在 foreach 中使用变量引用 ”

  1. # 1 網站製作學習誌 » [Web] 連結分享 Says:
    November 25th, 2009 at 10:36

    [...] PHP —— 为什么不要在 foreach 中使用变量引用 [...]

Leave a Reply

Trackback URI | Comments RSS

 

September 2010
M T W T F S S
« Aug    
 12345
6789101112
13141516171819
20212223242526
27282930  

Recent Comments

  • cbf107 on 我们精通精通
  • mikespook on 我们精通精通
  • == on 我们精通精通
  • 老熊 on 关于Web编程异步模型的白日梦
  • Some reminiscences, some memories » Blog Archive » Akihabara 指南目录 on Akihabara 指南

Tags

乱码 协程 地震 备案 安装 广州 异步 性能 我爱发明 扯淡 招聘 游戏 漏洞 翻译 豆瓣 39.com Adobe akihabara config countdown Demo Flash game engine golang google html5 issue linux Micromedia MongoDB mysql NetBeans nginx NoSQL oracle PHP phpunit Python trac ubuntu xdebug xml xubuntu yield Zend Framework

Blogroll

  • Blog on 27th Floor
  • DBA notes
  • Tim[后端技术]
  • 唐海燕
  • 小众音乐
  • 抚琴居
  • 某人的栖息地
  • 番茄’s Blog
  • 網站製作學習誌
  • 纸老虎传媒

Old friends

  • cbf107

Only

  • 媚惑桃花

OurPNP

  • Biaoest:标的最高级
  • flexsns-官方博客
  • PNP University
  • PNP街坊
  • smallfish 鱼哥的窝子
  • 冰山日志
  • 墙外的光神V5
  • 夜雨's Blog
  • 小冬kobe
  • 小路的奇异世界
  • 广州萌芽工作室
  • 老甘blog
  • 赖勇浩的编程私伙局

Meta

  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org

Powered by WordPress
mikespook.com 粤ICP备09065095号