【问题标题】:Which is the better way to reference a variable outside the function scope?在函数范围之外引用变量的更好方法是什么?
【发布时间】:2011-11-16 01:40:26
【问题描述】:

我可以通过以下两种方式之一更改函数中的$var:通过引用传递它或使用global 关键字。

$var1 = 10;

function test1() {
    global $var1;
    $var1++;
}

function test2(&$var) {
    $var++;
}

这两种方法的结果相同,但它们之间有什么区别吗?哪个是首选,哪个更快?

【问题讨论】:

标签: php pass-by-reference


【解决方案1】:

1.它们都不是首选。

除非您有特殊原因,否则首选是

$var1 = 10;
$var1 = test3($var1);
function test3($var)
{
    return $var + 1;
}

在程序的不同部分之间引入耦合(如果使用global)是您应该始终合理地尽量避免的事情。

此外,如果没有具体理由让你的函数通过引用接受它的参数,你也应该避免这样做。所有函数中只有极少数的部分会以这种方式运行,因此,如果没有其他原因,您可能会在使用此代码而没有真正利益的开发人员之间产生混淆。

2。您无需考虑哪个更快。

除非您在真实场景下分析过您的应用程序并发现此功能是一个瓶颈(当然它永远不会以这种简单的形式出现),否则以编写清晰和可维护的代码为代价来优化性能是不仅没有意义,而且有害。

作为奖励,我应该提一下,使用引用实际上可能使函数 slower

【讨论】:

  • 我认为这不是首选方法,例如,如果您使用大数组,则不能只制作多个副本。
  • @Geoffroy:你有什么理由这么说?你真的做过测试吗?你知道在 PHP wasstill is 中通过引用传递数组非常慢吗?
  • 也许,但它仍然比复制可能包含对象甚至单例的数组要好。如果你的阵列是 500 Mo 重量,那么你会复制它吗?它甚至比引用它还要慢。
  • @Geoffroy:如果您的数组是 500Mb,那么您一开始就不应该在内存中读取所有数据。让我们不要根据 ifs 和 buts 来表达意见——OP 询问一般来说什么更好。还要考虑一下您可能错了:PHP 对引用的数组使用写入时复制,因此如果您修改数组,您实际上根本不会获得任何速度。
  • 我承认你的回答很有道理,但我对 PHP 了解不多。但是按照您的说法,为什么 PHP 5.3 使用对象的自动引用? (确实如此,如果我没记错的话)
【解决方案2】:

首选方法是避免使用全局变量。原因是如果你把一个变量放在全局范围内,你就会失去对它的控制——随着项目的增长,你可能会忘记你的全局变量的名称是什么,并且你可能会在某个地方不小心覆盖它,这会让你自己非常头疼。

从性能的角度来看 - 引用更快,使用起来也更安全,因为您在方法的签名中定义是否使用引用,从而使实际的函数调用变得容易,因为您不必传递变量明确引用。

【讨论】:

    【解决方案3】:

    由于全局变量会污染命名空间(即可能会被无意中使用和/或由具有相同想法的另一个函数使用),因此最好使用引用。

    但是,在许多情况下(数据结构更复杂),您应该改用objects,如下所示:

    class Counter {
      private $val = 10;
      public function increment() {
        $this->val++;
      }
    }
    

    任何这些解决方案的速度都无关紧要,任何实际计算都会相形见绌。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 2013-12-08
      • 2021-07-15
      相关资源
      最近更新 更多