$GLOBALS['variable'];和全局变量$;


PHP What is the difference between $GLOBALS['variable']; and global $variable;

请看下面两个例子:

示例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时,您无法做到这一点。还有其他细微的差别,但我认为都不重要。

你可能想问自己是否应该使用全局变量,就我所知,它的使用方式几乎总是反模式的,尽管这可能是一种品味。

$GLOBALSArray的形式表示整个全局变量表

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")美元;