如果您对最终未使用的变量使用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();
}
}
我非常清楚使用第二种方法会使维护此代码变得更加困难,并且通常首选将所有全局变量放在函数的开头,因此:忽略可维护性和代码样式的差异在这两个函数中,这两个函数在开销方面有区别吗?
答案 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();
}
}
如果您不喜欢传递大量参数,可以使用类来封装它们,或者这可能表明您应该以不同方式对代码进行分解。