首页 > 程序员 > php中&符号的滥用与它引发的bug

php中&符号的滥用与它引发的bug

2010年5月7日 发表评论 阅读评论

php中,使用&表明这个引用是指针,这样在两个引用可以指向同一个内存空间。但其实不使用&的情况下,php也是写时拷贝的,zend引擎只有在修改的时候才会发生内存拷贝,不修改的话是不会产生消耗的。在实际使用中,我还发现使用&符号反而性能会降低。

在不需要修改的情况下,建议尽量不要使用&符号,否则不仅降低效率,还有可能造成出现bug。今天查看最近对测试框架的升级,就踩上了simpletest上面的一个bug,请看simpletest中,想testsuit加上case的函数:

function addTestCase(&$test_case) {
     $this->_test_cases[] = &$test_case;
}

这么简单的函数,我想大家一般都会认为没有问题吧,正常情况下它都能很好的工作,但是如果你这样用,就bug了:

foreach($arr_cases as $case){
     $this->test_suit->addTestCaseOpenTest($case);
}

你会发现_test_cases这个数组里面,只哟foreach最终的那个元素,因为函数都是接受的值引用,foreach改变$case的值,就把已经传入_test_cases数组的内容都给改写了,于是就悲剧了。对于simpletest来说,它并不需要修改用户的case程序,这样做值引用显然是多此一举,还产生了bug。

关于性能降低,用一个简单的代码测试一下就知道了

$a = array('a','c','n'); 

function printArray(&$arr)
{
    print(count($arr));
}

for($i=0;$i<100000;$i++){
    printArray($a);
}

用time命令跑一次,把printArray的&符号去掉再跑一次,可以看到大致下面的结果(机器不同,结果不同啊)

带有&符号 不带有&符号
real    0m0.183s
user    0m0.130s
sys     0m0.053s
real    0m0.160s
user    0m0.101s
sys     0m0.060s

可见使用&反而会使性能下降的,所以除非有必要,不建议使用&符号

---------------------------------------------------------------
本站作品根据创作共同协议进行授权, 转载时请务必以超链接形式标明文章原始出处
原文地址:http://www.mirecle.com/2010/05/07/php-in-the-ampersand-on-the-abuse-of.html
---------------------------------------------------------------

您可能会喜欢:

  1. sql运行简单封装
  2. php中getopt的缺陷及修复
  3. php反射效果:基类访问子类数据
  4. php中set names与mysql_set_charset
  5. java中String.split导致的内存泄露
分类: 程序员 标签:

  1. 2010年5月22日12:10 | #1

    你每次循环 都改变了$case 的值 当然是这个结果

  1. 本文目前尚无任何 trackbacks 和 pingbacks.