什么时候在PHP中使用pass by reference是好的?

时间:2011-03-29 21:19:09

标签: php

在C ++中,如果将大型数组传递给函数,则需要通过引用传递它,这样就不会将其复制到浪费内存的新函数中。如果你不想修改它,你可以通过const引用传递它。

任何人都可以验证通过引用传递也会在PHP中保存内存。我知道PHP不会使用像C ++这样的引用的地址,这就是为什么我有点不确定。这是个问题。

3 个答案:

答案 0 :(得分:60)

以下内容不适用于对象,因为此处已经说明了这一点。通过引用传递数组和标量值只会在您计划修改传递的值时节省内存,因为PHP使用更改时复制(也称为写时复制)策略。例如:

# $array will not be copied, because it is not modified.
function foo($array) {
    echo $array[0];
}

# $array will be copied, because it is modified.
function bar($array) {
    $array[0] += 1;
    echo $array[0] + $array[1];
}

# This is how bar shoudl've been implemented in the first place.
function baz($array) {
    $temp = $array[0] + 1;
    echo $temp + $array[1];
}


# This would also work (passing the array by reference), but has a serious 
#side-effect which you may not want, but $array is not copied here.
function foobar(&$array) {
    $array[0] += 1;
    echo $array[0] + $array[1];
}

总结:

  • 如果您正在处理一个非常大的数组并计划在函数内修改它,您实际应该使用引用来防止它被复制,这会严重降低性能甚至耗尽内存限制。

  • 如果它是可以避免的(那是小数组或标量值),我总是使用功能风格的方法,没有副作用,因为只要你通过引用传递一些东西,你永远不可能确定在函数调用之后传递的变量可能会保留,这有时会导致令人讨厌且难以发现的错误。

  • IMHO标量值绝不应该通过引用传递,因为性能影响不能大到证明代码中透明度丢失的合理性。

答案 1 :(得分:11)

简短的回答是当您需要提供的功能时使用引用。不要在内存使用或速度方面考虑它们。如果变量是只读的,则按引用传递总是会变慢。

所有内容都按值传递,包括对象。但是,它是传递的对象的句柄,因此人们经常错误地将其称为引用,因为它看起来像那样。

那么它提供了什么功能?它使您能够修改调用范围中的变量:

class Bar {}
$bar = new Bar();

function by_val($o) { $o = null; }
function by_ref(&$o) { $o = null; }

by_val($bar); // $bar is still non null
by_ref($bar); // $bar is now null

因此,如果您需要此类功能(通常不需要),请使用引用。否则,只需按值传递。

看起来像这样的函数:

$foo = modify_me($foo);

有时候是传递引用的好选择,但是应该绝对清楚该函数修改传入的变量。 (如果这样的函数很有用,通常是因为它真的应该只是某个类修改自己的私有数据的一部分。)

答案 2 :(得分:9)

在PHP中:

  • 对象通过引用传递 1 - always
  • 默认情况下,数组和标量按值传递;并且可以使用函数声明中的&传递by reference


对于问题的性能部分,PHP没有像C / C ++那样处理它;你应该阅读以下文章:Do not use PHP references


1。 或者这就是我们通常所说的 - 即使它不是“完全正确” - 请参阅Objects and references