你如何定义全局变量?

时间:2011-05-06 16:20:20

标签: php global-variables global

那么您更喜欢如何声明和使用全局变量? 1)

global variable;
echo $variable;

或2)

echo $GLOBALS['variable'];

哪种方法不太糟糕? :)

编辑:

或3)

class myglobalstuff{

  static $instance;

  public static function foo(){
    if(!(self::$instance instanceof self))
      self::$instance = new self();

    return self::$instance;
  }
}
...

7 个答案:

答案 0 :(得分:4)

使用$GLOBALS不太糟糕。但如果可以,请避免使用全局:)

答案 1 :(得分:2)

PHP手册解释了如何定义和使用全局变量:$GLOBAL

答案 2 :(得分:2)

global关键字不会创建全局变量,它只是告诉脚本将变量视为全局范围。

$GLOBALS数组实际上是一个超全局变量,略有不同。

这里有更多信息,这是一个很好的阅读:http://php.net/manual/en/language.variables.scope.php

答案 3 :(得分:1)

我们宁愿根本不使用全局变量。对于单身人士和注册管理机构以及其他拥有全球国家的方式也是如此。

如果您学会了如何编写正确的OOP代码,那将会好得多。


更新

很少有链接和相关信息:

答案 4 :(得分:1)

暂时搁置一下邪恶的全局变量可能是什么,让我把它分解为一个我发现的更普遍的问题:使用字符串数组键而不是变量。

键入字符串数组键可能会导致拼写错误,发现可能很棘手:$GLOBALS['var1'] vs $GLOBALS['varl'](一个与lamda相比)。

如果您有一个自动完成的现代IDE,您会发现声明global $variable然后在输入时调用自动完成以获得指示您没有输入拼写错误。

这样一个现代的IDE也可能会突出显示哪些内容有助于避免拼写错误(你可以看到它是否出现在附近)以及导航你的代码。它同样只适用于变量而不是数组键。

如果你需要使用全局变量,那么使用$GLOBALS可能会更好地提醒你在追找某个值时变量的来源。但是,最好将变量名定义为常量,以利用IDE自动完成和出现突出显示:$GLOBALS[_VAR1]

当然,这些漂亮的功能也适用于类变量,这是考虑重构的另一个原因:)

答案 5 :(得分:0)

我会$_SESSION['var']超过$GLOBALS。它或多或少相同,但更安全。 编辑:我想说更优选的方法。但据说不管怎么说,GLOBALS很快就会贬值。

答案 6 :(得分:0)

另外,忽略“无全局”论点,我想对“全局”声明的使用做出很好的区分,因为我已经看到它被滥用了。至少在PHP 5中,在全局范围代码中执行以下操作是没有意义的(代码不在函数或方法声明中):

global $foo;
$foo = "someValueForEverything";

$ foo是全局的,因为它是全局声明的(不是因为“global”关键字)。一个人会在里面使用一个需要引用全局$ foo的函数或方法(否则会产生一个本地的$ foo)。