哪个是在函数范围之外引用变量的更好方法?

时间:2011-09-13 10:49:20

标签: php pass-by-reference

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

$var1 = 10;

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

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

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

3 个答案:

答案 0 :(得分:5)

<强> 1。没有一个是首选。

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

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

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

此外,如果没有具体原因让你的函数通过引用接受它的参数,你也应该避免这样做。只有非常微小的所有函数才能以这种方式运行,所以如果没有其他任何事情,那么使用这些代码的开发人员之间就不会产生混淆。

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

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

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

首选方法是避免全局变量。原因是如果你把一个变量放在全局范围内,你将失去对它的控制 - 因为项目增长,你可能会忘记你的全局变量的名称是什么,你可以在某个地方意外地覆盖它,给你自己带来了令人难以置信的头痛。

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