【问题标题】:How do you define global variables?你如何定义全局变量?
【发布时间】:2011-08-20 07:54:59
【问题描述】:

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

?

【问题讨论】:

  • 对于内部类方法,访问类的属性?如果是这样的话,我会说$this->variable 会好很多。

标签: php global-variables global


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    使用$GLOBALS 没有那么糟糕。但如果可以,请避免使用全局变量 :)

    【讨论】:

      【解决方案3】:

      我们宁愿完全不使用全局变量。 Singletons 和 Registries 以及其他所有拥有全局状态的方式也是如此。

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


      更新

      几个链接和相关信息:

      【讨论】:

      • @Alex:不,只有在应用程序设计存在缺陷的情况下。 The Clean Code Talks - "Global State and Singletons"
      • 如果您可以扩展正确的方法或链接到有关正确方法的一些阅读材料,我真的很感兴趣。
      • @Brad 你到底在追求什么样的材料?如果你想知道你应该避免什么全局状态,那么在代码中,web 充满了链接。如果你想要这些书,然后向下滚动到this answer的底部,你会找到我推荐的书(没有足够的空间来评论)
      • @teresko:该视频是关于 java 的。我不知道 java :( 也许它比 php 更好?无论如何,在 PHP 中避免全局变量的唯一方法是在函数之间疯狂传递参数。这不会比使用全局变量造成更多的混乱吗?
      • @teresko,您可以编辑您的答案并包含该链接:) 这是很好的材料,我计划阅读它。感谢您的链接。
      【解决方案4】:

      我会选择$_SESSION['var'] 而不是$GLOBALS。它的作用或多或少相同,但更安全。 编辑:我的意思是说更喜欢的方法。但据说 $GLOBALS 很快就会贬值。

      【讨论】:

      • 不是这样,将内容塞入会话中只是为了使它们全局化是一个坏主意,因为它可能会对应用程序产生不利影响(因为它会保留数据)。如果你真的需要全局变量,那么我会把它放在单例后面,但我的建议是将数据作为参数传递。
      • @John,你可以在完成后通过运行 session_destroy() 和 unset() 来清除会话,所以如果你正确使用它来将它从页面来回切换到页面为全局。
      • 同意约翰,这在技术上有点荒谬,无意冒犯个人。
      • 我猜是他们自己的。没有冒犯;)
      【解决方案5】:

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

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

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

      【讨论】:

      • 就像尼克说的那样,在全局范围的代码(不在函数或方法声明中的代码)中执行以下操作是没有意义的: global $foo; $foo = "someValueForEverything"; $foo 是全局的,因为它是全局声明的(不是因为“global”关键字)。可以使用“全局”inside 一个需要引用全局 $foo 的函数或方法(否则会出现本地 $foo)。
      【解决方案6】:

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

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

      如果您有一个支持自动补全的现代 IDE,您会发现声明 global $variable 然后在输入时调用自动补全以指示您没有打错字会很有用。

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

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

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

      【讨论】:

        【解决方案7】:

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

        global $foo;
        $foo = "someValueForEverything";
        

        $foo 是全局的,因为它是全局声明的(不是因为“global”关键字)。可以在需要引用全局 $foo 的函数或方法内部使用“全局”(否则会出现本地 $foo)。

        【讨论】:

          猜你喜欢
          • 2012-08-08
          • 1970-01-01
          • 1970-01-01
          • 2011-09-16
          • 2015-10-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多