PHP $ GLOBALS ['variable']之间有什么区别;和全球$变量;

时间:2011-09-15 10:56:30

标签: php global-variables scope

请看以下两个例子:

示例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();

两者似乎都做同样的事情?有什么不同?有一种方式比另一种更好吗?为什么有两种不同的方法呢?

第一个例子对我来说很奇怪,因为它看起来像一个声明,然后使用变量而不指定它。看起来很奇怪。

谢谢。

5 个答案:

答案 0 :(得分:6)

global关键字将变量“导入”到本地范围,而通过$GLOBALS访问全局则不会。

答案 1 :(得分:2)

$GLOBALS只是访问全局变量的另一种方式。 global关键字将全局变量导入本地范围。 $GLOBALS可用于访问全局变量,而不会污染本地范围。

例如,它可用于迭代全局变量。

请参阅$GLOBALS

  

$ GLOBALS - 引用全局范围内可用的所有变量

the global keyword

  

通过在函数中声明$ a和$ b global,对任一变量的所有引用都将引用全局版本。

     

从全局范围访问变量的第二种方法是使用特殊的PHP定义的$ GLOBALS数组。

答案 2 :(得分:1)

正在使用一个区别。来自manual page

<?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();
?>

您可以看到您可以访问此全局变量和本地变量。使用global $foo时,您无法执行此操作。还有其他的微妙差异,但我认为没什么关系。

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

答案 3 :(得分:1)

$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

答案 4 :(得分:0)

来自php手册http://php.net/manual/en/language.references.whatdo.php

  

考虑全球$ var;作为$ var =&amp;的快捷方式$ GLOBALS [&#39;无功&#39;];