什么时候在PHP中使用按引用传递比较好? C++中,如果将一个大数组传递给函数,则需要通过引用传递它,这样它就不会被复制到新函数中浪费内存。如果不想修改它,可以通过常量引用传递它

什么时候在PHP中使用按引用传递比较好? C++中,如果将一个大数组传递给函数,则需要通过引用传递它,这样它就不会被复制到新函数中浪费内存。如果不想修改它,可以通过常量引用传递它,php,Php,任何人都可以验证通过引用传递也可以在PHP中为我节省内存吗。我知道PHP不使用地址来引用C++,这就是为什么我有点不确定。这就是问题所在。在PHP中: 对象通过引用1传递--始终 默认情况下,数组和标量按值传递;可以使用函数声明中的&传递 对于问题的性能部分,PHP的处理方式与C/C++不同;您应该阅读以下文章: 1.或者这就是我们通常所说的——即使它不是“完全正确的”——参见以下内容不适用于对象,正如这里已经说明的那样。如果打算修改传递的值,通过引用传递数组和标量值只会节省内存,因为P

任何人都可以验证通过引用传递也可以在PHP中为我节省内存吗。我知道PHP不使用地址来引用C++,这就是为什么我有点不确定。这就是问题所在。

在PHP中:

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

对于问题的性能部分,PHP的处理方式与C/C++不同;您应该阅读以下文章:



1.或者这就是我们通常所说的——即使它不是“完全正确的”——参见

以下内容不适用于对象,正如这里已经说明的那样。如果打算修改传递的值,通过引用传递数组和标量值只会节省内存,因为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];
}
总结如下:

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

  • 如果可以避免的话(即小数组或标量值),我总是使用函数式方法,没有任何副作用,因为只要通过引用传递某个内容,就永远无法确定传递的变量在函数调用后可能包含什么,这有时会导致讨厌的、难以发现的bug

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


    • 简单的回答是,当您需要引用所提供的功能时,请使用引用。不要从内存使用或速度的角度来考虑它们。如果变量是只读的,则通过引用传递的速度总是较慢

      一切都是按值传递的,包括对象。然而,传递的是对象的句柄,因此人们经常错误地通过引用调用它,因为它看起来像这样

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

      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);
      

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

      我有点困惑。。这是否意味着我可以创建一个singleton类并向站点的每个访问者传递一个引用,而不是为每个访问者查询数据库?(所有访问者都在请求相同的数据)在PHP中,您将不会有“每台服务器”的单例,而是“每执行一个脚本”的单例。每个用户都有自己独特的、独立的脚本执行——这意味着每个用户都有自己的内存空间;对于脚本的一次执行,您的单例将是单例;脚本的每次执行都会有它自己的单例实例,这很可悲。。如果在php中有这样一个功能就太好了。谢谢。除非你将数据串行化到数据库或磁盘。还有缓存模块,你可以用你所描述的方式缓存数据。只是C++相关的注释:传递给函数的数组实际上是指针,因此传递一个引用给他们是不必要的,实际上并没有按照你的想法去做。完全同意常量!谢谢你和+1的解释。因为我很难找到关于改变时复制的信息:在谷歌上搜索“写时复制”,你就可以