这是一个非常有趣的问题,我花了一个半小时的时间阅读了关于PHP以及它如何处理引用(感谢Tim Cooper让我开始的链接)。
要回答你的问题,是的 - 当你调用一个函数时,最好使用这样的引用。通过使用引用,您将使用更少的资源 - 对于引用变量,没有“写入时复制”。下面是一些证据:
<?php
function noref_nowrite($var_a){
echo '<h3>NOT Using a Reference/Not Changing Data</h3>';
echo '<p>'. xdebug_debug_zval('var_a') .'</p>';
echo '<p>'. debug_zval_dump($var_a) .'</p>';
echo '<p>$var_a = '. $var_a .' and $GLOBALS[a] = '. $GLOBALS['a'] .'</p>';
}
function noref_write($var_a){
$var_a++;
echo '<h3>NOT Using a Reference/Changing Data</h3>';
echo '<p>'. xdebug_debug_zval('var_a') .'</p>';
echo '<p>'. debug_zval_dump($var_a) .'</p>';
echo '<p>$var_a = '. $var_a .' and $GLOBALS[a] = '. $GLOBALS['a'] .'</p>';
}
function ref_nowrite(&$var_a){
echo '<h3>Using a Reference/Not Changing Data</h3>';
echo '<p>'. xdebug_debug_zval('var_a') .'</p>';
echo '<p>'. debug_zval_dump($var_a) .'</p>';
echo '<p>$var_a = '. $var_a .' and $GLOBALS[a] = '. $GLOBALS['a'] .'</p>';
}
function ref_write(&$var_a){
$var_a++;
echo '<h3>Using a Reference/Changing Data</h3>';
echo '<p>'. xdebug_debug_zval('var_a') .'</p>';
echo '<p>'. debug_zval_dump($var_a) .'</p>';
echo '<p>$var_a = '. $var_a .' and $GLOBALS[a] = '. $GLOBALS['a'] .'</p>';
}
$a = 5;
noref_nowrite($a);
noref_write($a);
ref_nowrite($a);
ref_write($a);
?>
如果你复制/粘贴上面的代码到一个PHP页面并执行它,你会看到:
NOT Using a Reference/Not Changing Data
var_a: (refcount=3, is_ref=0)=5
long(5) refcount(4)
$var_a = 5 and $GLOBALS[a] = 5
NOT Using a Reference/Changing Data
var_a: (refcount=1, is_ref=0)=6
long(6) refcount(2)
$var_a = 6 and $GLOBALS[a] = 5
Using a Reference/Not Changing Data
var_a: (refcount=3, is_ref=1)=5
long(5) refcount(1)
$var_a = 5 and $GLOBALS[a] = 5
Using a Reference/Changing Data
var_a: (refcount=3, is_ref=1)=6
long(6) refcount(1)
$var_a = 6 and $GLOBALS[a] = 6
所以,我们在这里是四个基本的测试。我创建一个全局变量($ a)和分配给它的5
值当我打电话noref_nowrite功能,我们看到了XDebug计数3个引用而PHP的内置函数计算4.有趣的是,PHP优化此所以在内部它的真的很像调用ref_nowrite函数,因为PHP使$ var_a成为$ GLOBALS ['a']的引用。
当我调用noref_write函数时,我们看到refcount下降到1(或者如果您查看PHP的内置函数,则为2)。为什么?因为这是“写入时复制”问题发生的地方。直到我们增加了$ var_a PHP在内部使用$ var_a作为$ a的引用,但是当我们改变了值时,我们强迫PHP创建了一个变量副本,以便它可以增加。因此,$ var_a不再是对$ a的引用,而是改为引用它自己的数据。
ref_nowrite函数显示不明确的结果。单看它,我们无法证明任何事情。然而,ref_write函数告诉我们XDebug表示我们正在处理一个引用变量(is_ref = 1),最重要的是我们看到,在我们增加$ var_a后,全局变量$ a的值也发生了变化 - 这意味着$ var_a和$ GLOBALS ['a']绝对指向内存中的相同位置。这意味着更改$ var_a不会触发“写入时复制”情况 - 并且不应该因为我们正在处理引用。
玩这个说服自己和这里的一些更多阅读:
Detecting whether a PHP variable is a reference/referenced(我认为ircmaxell有一个深思熟虑的答案)
http://us2.php.net/debug-zval-dump
XDebug的文档:http://xdebug.org/docs/display
PHP参考做什么:http://us3.php.net/manual/en/language.references.whatdo.php
PHP参考计数基础知识:http://us3.php.net/manual/en/features.gc.refcounting-basics.php
这个最近的问题可能会对您有所帮助: [为什么在PHP中很少使用引用?](http://programmers.stackexchange.com/q/188765/4978) –