什么时候在PHP中传递引用

时间:2010-01-28 20:42:43

标签: php pass-by-reference

我想知道当你只读取一个变量时它是否是传递引用的好方法,或者它是否应该总是作为一个值传递。

传递引用的示例:

$a = 'fish and chips';
$b = do_my_hash($a);
echo $b;

function &do_my_hash(&$value){
   return md5($value);
}

传递值的示例:

$a = 'fish and chips';
$b = do_my_hash($a);
echo $b;

function do_my_hash($value){
   return md5($value);
}

哪个更好?例如,如果我要进行1000轮循环?

循环示例:

for($i = 0 ; $i < 1000 ; $i++){
   $a = 'Fish & Chips '.$i;
   echo do_my_hash($a);
}

5 个答案:

答案 0 :(得分:45)

如果您要传递 (因此该功能不会对其进行修改),则没有理由通过引用传递它:它只会使您的代码更难理解,因为人们会认为“这个函数可以修改我将传递给它的东西 - 哦,它不会修改它?

在您提供的示例中,您的do_my_hash函数不会修改您传递给它的;所以,我不会使用参考。

如果您对性能感到担忧,请阅读最近的博文:Do not use PHP references

  

人们使用参考的另一个原因是   因为他们认为这会产生代码   快点。但这是错误的。它是均匀的   更糟糕的是:引用主要是代码   慢点!是的,引用经常提到   代码更慢 - 对不起,我只是不得不这样做   重复这一点以表明清楚。

实际上,这篇文章可能是一本有趣的读物,即使你并不主要关注表现; - )

答案 1 :(得分:12)

PHP尽可能地使用copy-on-write(只要它通常会提高性能),因此使用引用不会给你带来任何性能上的好处;它只会伤害。仅在您真正需要时才使用引用。从PHP手册:

  

使用按引用返回来提高性能。引擎将自动对其进行自动优化。只有在有正当技术理由的情况下才能返回引用。

答案 2 :(得分:8)

良好的编程习惯总是尽可能地传递值,如果你必须修改单个值,通常最好是通过函数返回修改后的值,而不是通过引用传递值。

您可能需要通过引用传递的唯一情况是您需要修改多个值的位置。然而,这些情况往往很少见,通常应将其作为检查代码的标志,因为可能有更好的方法来解决问题。

早在早期的编程语言总是习惯于通过引用传递并且通过值传递是后来的开发来解决这个问题所产生的问题(你往往最终会出现模糊的错误,因为一些程序员迟早会把代码放入在某个函数或其他函数中修改传递的引用值,然后确定正确的位置和修复是很棘手的 - 你往往会得到多个,模糊的依赖关系)。因此,当我们的多代处理器被认为是cpu与复杂性的良好平衡以帮助清洁,可维护时,认真考虑将其作为削减几个机器周期的选项是非常有悖常理的。代码。

答案 3 :(得分:3)

微优化的乐趣。 : - )

老实说,通过引用传递“正常”变量可能没有太大的收获(除非你想影响它们在原始范围内的价值)。此外,由于PHP 5对象通过引用自动传递。

答案 4 :(得分:2)

如果您不想在函数内修改该值,则按引用传递不会带来任何好处。我尽量使用pass-by-value,因为它更容易阅读,并且脚本的流程更加一致。