使用global会产生任何开销吗?

时间:2008-10-08 03:59:18

标签: php optimization

如果您对最终未使用的变量使用global关键字,是否会出现问题?比较:

function foo() {
    global $fu;
    global $bah;
    if (something()) {
        $fu->doSomething();
    } else {
        $bah->doSomething();
    }
}

function bar() {
    if (something()) {
        global $fu;
        $fu->doSomething();
    } else {
        global $bah;
        $bah->doSomething();
    }
}

我非常清楚使用第二种方法会使维护此代码变得更加困难,并且通常首选将所有全局变量放在函数的开头,因此:忽略可维护性和代码样式的差异在这两个函数中,这两个函数在开销方面有区别吗?

4 个答案:

答案 0 :(得分:8)

如果存在,它将不会(人性地)可测量,除非你真的称呼这个函数数百万次。即使它是具有该属性的递归函数,我仍然不会将您的第二种方法用于您已经提出的可维护性方面。

编辑:为了论证,我实际上对此进行了基准测试,bar()在一百万次调用中的结果慢了0.1秒。这意味着性能明智,你仍然有理由使用更清洁的版本。

答案 1 :(得分:1)

正如一氧化物所说,没有明显的性能差异。

但是,如果可能的话,我会避免使用全局;走下去是一条糟糕的道路,你最终会吃意大利面条。使用静态类;它会让事情变得更有条理。

答案 2 :(得分:0)

如果您不知道,可以执行以下操作:

function foo() {
    global $fu, $bah;
    if (something()) {
        $fu->doSomething();
    } else {
        $bah->doSomething();
    }
}

您可以将两个全局变量放在同一行中。甚至可以让它更快:)

答案 3 :(得分:-1)

全局变量通常被认为是非常糟糕的风格。我会声称,只要你需要使用global关键字或静态类属性(因此,包括臭名昭着的Singleton),你应该认真地重新考虑你在做什么。避免全局变量可能稍微有些工作,但这对代码可维护性来说是一个巨大的好处。这个特殊的例子可以用以下方式更好地表达:

function foo($fu, $bah) {
  if (something()) {
    $fu->doSomething();
  } else {
    $bah->doSomething();
  }
}

如果您不喜欢传递大量参数,可以使用类来封装它们,或者这可能表明您应该以不同方式对代码进行分解。