请看下面两个例子:
示例1:
$variable = 'some value';
class Foo {
public function bar() {
global $variable;
print $variable;
}
}
示例2:
$variable = 'some value';
class Foo {
public function bar() {
print $GLOBALS['variable'];
}
}
示例可以这样使用:
$foo = new Foo();
$foo->bar();
两者似乎做同样的事情?有什么区别呢?一种方法比另一种方法好吗?为什么会有两种不同的方法呢?
第一个例子对我来说似乎很奇怪,因为它看起来像一个声明,然后使用变量而不赋值。我觉得很奇怪。
谢谢。
global
关键字将变量'导入'到局部作用域,而通过$GLOBALS
访问全局变量则不会。
$GLOBALS
只是访问全局变量的另一种方式。global
关键字将全局变量导入到局部作用域中。$GLOBALS
可以用来访问全局变量,而不会污染局部作用域。
可用于遍历全局变量,例如
参见$GLOBALS
:
$GLOBALS -引用全局作用域中所有可用的变量
And the global keyword
:
通过在函数内声明$a和$b为全局变量,对其中任何一个变量的所有引用都将引用全局版本。
从全局作用域中访问变量的第二种方法是使用php定义的$GLOBALS数组。
区别在于使用。从手册页
<?php
function test() {
$foo = "local variable";
echo '$foo in global scope: ' . $GLOBALS["foo"] . "n";
echo '$foo in current scope: ' . $foo . "n";
}
$foo = "Example content";
test();
?>
你可以看到你可以访问this,全局变量和局部变量。当使用global $foo
时,您无法做到这一点。还有其他细微的差别,但我认为都不重要。
你可能想问自己是否应该使用全局变量,就我所知,它的使用方式几乎总是反模式的,尽管这可能是一种品味。
$GLOBALS
以Array
的形式表示整个全局变量表
global
关键字允许您指定一个或多个变量标签,它们是局部变量表中全局变量表的一部分。在其他回答中通常称为import。
曾经有一段时间,函数作用域中的$GLOBALS
没有立即更新全局表。但我认为现在这个问题已经解决了。至少我不能再复制它了。
所以区别仅仅是如何写东西的语义。
然而,两者之间有一个区别。当你通过global
关键字使全局变量在局部范围内可访问时,你不能取消对全局变量的设置。
$var = 1;
foo();
function foo()
{
global $var;
unset($var); # won't unset the global variable
}
但是你可以通过$GLOBALS
访问它们。
$var = 1;
foo();
function foo()
{
unset($GLOBALS['var']); # unsets the global variable
}
这是非常具体的,如果感兴趣,请参见Demo。
From php manual http://php.net/manual/en/language.references.whatdo.php
考虑全局$var;作为$var =&全局变量("var")美元;