这是在函数作用域之外引用变量的更好方法


Which is the better way to reference a variable outside the function scope?

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

$var1 = 10;
function test1() {
    global $var1;
    $var1++;
}
function test2(&$var) {
    $var++;
}

两种方法都有相同的结果,但是它们之间有什么区别吗?哪一个更受欢迎,哪一个更快?

1。

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

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

在程序的不同部分之间引入耦合(如果使用global)是您应该总是合理地尝试避免的。

另外,如果没有具体的理由让你的函数通过引用接受它的参数,你也应该避免这样做。所有函数中只有很小一部分是这样的,所以如果不出意外的话,您可能会让使用这些代码的开发人员感到困惑,而没有真正的好处。

2。你不需要考虑哪一个更快

除非您在实际场景下对应用程序进行了概要分析,并发现该函数是一个瓶颈(当然,在这种简单形式下它永远不会是瓶颈),否则以编写清晰和可维护的代码为代价来优化性能不仅是毫无意义的,而且是有害的。

作为奖励,我应该提到使用引用实际上可能使函数变慢

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

然而,在许多情况下(数据结构更复杂),您应该使用对象,像这样:

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

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

首选的方法是避免全局变量。原因是,如果你把一个变量放在全局作用域中,你就失去了对它的控制——随着项目的增长,你可能会忘记你的全局变量的名字是什么,你可能会在某个地方不小心覆盖它,给你自己带来难以置信的头痛。

从性能的角度来看,引用更快,使用起来也更安全,因为你在方法的签名中定义了是否使用引用,使得实际的函数调用变得容易,因为你不必显式地通过引用传递变量。