如何定义全局变量


How do you define global variables?

那么你更喜欢如何声明和使用全局变量?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;
  }
}
...

使用 $GLOBALS 就不那么糟糕了。但如果可以的话,请避免全局:)

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

global 关键字不会创建全局变量,它只是告诉脚本使用全局范围处理变量。

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

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

我们宁愿根本不使用全局变量。单例和注册表以及拥有全局状态的所有其他方式也是如此。

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


更新

几个链接和相关信息:

  • 不可测试的代码
  • 全局变量 ar 坏
  • 清洁代码会谈 - "全球状态和单例"(视频)
  • TotT:使用依赖注入来避免单例
  • 避免单例
  • 为什么单身人士是邪恶的
  • 单例与只创建一个

且不谈全局变量的邪恶程度,让我将其分解为我发现的一个更通用的问题:使用字符串数组键而不是变量。

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

如果你有一个执行自动完成的现代IDE,你会发现声明global $variable很有用,然后在键入它时,调用自动完成来指示你没有输入拼写错误。

这种现代 IDE 还可能具有突出显示的情况,这将有助于避免拼写错误(您可以查看它是否出现在附近)以及导航代码。同样,它仅适用于变量而不是数组键。

如果您需要使用全局变量,那么当您寻找某些值时,使用 $GLOBALS 可能会更好地提醒您变量的来源。但是,至少将变量名称定义为常量以利用 IDE 自动完成和出现突出显示可能会有所回报:$GLOBALS[_VAR1]

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

我会和$_SESSION['var']一起$GLOBALS.它或多或少相同,但更安全。编辑:我的意思是说更首选的方法。但据说$GLOBALS很快就贬值了。

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

global $foo;
$foo = "someValueForEverything";

$foo是全局的,因为它是全局声明的(不是因为"global"关键字)。 人们会在需要引用全局$foo的函数或方法中使用"global"(否则就会出现局部$foo)。