php中&符号的滥用与它引发的bug
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
---------------------------------------------------------------
您可能会喜欢:
你每次循环 都改变了$case 的值 当然是这个结果