在C ++中,如果将大型数组传递给函数,则需要通过引用传递它,这样就不会将其复制到浪费内存的新函数中。如果你不想修改它,你可以通过const引用传递它。
任何人都可以验证通过引用传递也会在PHP中保存内存。我知道PHP不会使用像C ++这样的引用的地址,这就是为什么我有点不确定。这是个问题。
答案 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中:
&
传递by reference。
对于问题的性能部分,PHP没有像C / C ++那样处理它;你应该阅读以下文章:Do not use PHP references
1。 或者这就是我们通常所说的 - 即使它不是“完全正确” - 请参阅Objects and references