【问题标题】:PHP global or $GLOBALSPHP 全局或 $GLOBALS
【发布时间】:2011-04-04 04:23:48
【问题描述】:

当我想使用在函数外部声明的变量时,是否有最佳实践/建议:

  1. global $myVar
  2. $GLOBALS['myVar']

谢谢。

【问题讨论】:

    标签: php variables function global


    【解决方案1】:

    好吧,您应该只在有限的情况下使用全局变量,但要回答您的问题:

    1. global 可能会稍微快一些(它很少会产生影响)。
    2. $GLOBALS(不是$GLOBAL)更具可读性,因为每次你看到它,你就知道你正在访问/更改一个全局变量。这对于避免严重的错误至关重要。
    3. 在函数内部,如果要取消设置全局变量,必须使用unset($GLOBALS['varname']),而不是global $varname; unset($varname);

    关于第 1 点和第 2 点,我会在这里quote Sara Golemon:

    这对您使用$GLOBALS 数组意味着什么?没错,global 关键字在技术上更快。现在,我想在这里非常清楚一件事。使用全局变量作为本地化 [编译变量] 所带来的轻微速度负担需要认真权衡五年内查看代码并知道 $foo 来自全局范围的可维护性。 something_using($GLOBALS['foo']); 总是比 global $foo; /* buncha code */ something_using($foo); 更清楚你的底线,不要吝啬和愚蠢..

    【讨论】:

    • 我同意你的观点,$GLOBALS 远胜于“global”
    • +1 用于实际回答所提出的问题。全局变量可能不是最佳实践,但有时我们必须使用它们(WordPress,有人吗?)。
    • @Artefacto,关于可读性(以及 Sara Golemon)的第 2 点,这只是意味着您的 IDE 很糟糕。
    • @Artefacto,大部分代码的创建和修改都是在编辑器上完成的。我认为黑白视图的优化应该具有最低的优先级,如果有的话,它们很容易被其他选项在彩色视图中提供的小优势所抵消。甚至在线代码显示也有颜色。
    • @Pacerier 1) 在线代码显示不解析 global 来检测哪些变量是本地变量,2) 并非每个人都使用 IDE(我记得在 Facebook 上阅读过更多的人没有使用改用 vim 之类的东西,至少我在 vim 中对 PHP 文件的语法突出显示没有检测到变量范围)和 3)即使您的 IDE 检测到全局变量,$GLOBALS 也会比您选择的任何颜色更清晰,即使它是绿色而不是粉红色.
    【解决方案2】:

    在函数顶部使用global。这样,您可以轻松查看使用了哪些全局变量。

    【讨论】:

    • 除非函数很长(例如一个大的 switch 语句),现在你不知道什么是全局的,什么不是。您可以通过 phpdoc (@global) 声明您使用的全局变量。
    【解决方案3】:

    global $var; 等价于$var =& $GLOBALS['var']

    有人建议它比使用$GLOBALS 更快,但事实并非如此。如果您只使用该变量一次,$GLOBALS 会更快,因为您不会浪费时间进行赋值。

    但是,如果您确实多次使用该变量,则使用 global(或等效赋值)会更快,因为只在数组中搜索一次 var 键。

    这就是速度。但是,速度差异真的很小,可读性更重要。然而,不同的人对可读性有不同的偏好——我更喜欢global,其他一些人在这里回答更喜欢$GLOBALS,所以由你决定什么看起来更好。

    【讨论】:

    • 你的前两段是错误的。好吧,第一个是错误的。它在语义上是等效的,但它们不会转换为相同的操作码,并且global $var$var =& $GLOBALS['var'] 更快。第二段完全是错误的。
    • @Artefacto:嗯,我认为它们真的是等价的。感谢您指出这一点,我会尝试找到有关此的更多信息。
    • 同样,第二个是错误的,在这个codepad.viper-7.com/roRI8g 上运行“配置文件代码”你会看到global 只是一个哈希查找加上一个已编译变量的存储。 $GLOBALS 变体需要两次哈希查找。它没有存储在任何变量中,但在性能方面,它与存储在编译变量中没有任何区别。
    • @Artefacto:我现在明白了。此外,codepad.viper-7.com/YfjsII 表明该分配确实使用了比全局多一个操作码。
    【解决方案4】:

    你真正应该做的是将变量传递给函数,而不是使用全局变量。

    如何通过将变量作为引用参数传递来更改函数外部变量的示例:

    function myFunc(&$myVar)
    {
        $myVar = 10;
    }
    
    $foo = 0;
    myFunc($foo);
    var_dump($foo); // yields 10
    

    【讨论】:

    • @Francisc 如果你真的想要,你可以通过引用传递。
    • 我附上了一个例子来演示如何使用 Artefacto 建议的参考。
    • 我想要做的是有一个 $output 变量,它不断地与新数据连接,而不是 $output.='something' 我想做 writeFunction('something')。函数本身就是 function writeFunction($str){global $output;$output.=$str;) 有没有更好的方法呢?
    • function writeFunction(&$output, $str) { $output .= $str; } 并使用它:writeFunction($output, "something");
    • 是的。以这种方式编写的函数不仅限于处理全局变量。您还可以在本地范围内声明的变量上使用它们。它们也不限于使用具有特定名称的外部变量。
    猜你喜欢
    • 2011-11-17
    • 2018-09-19
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 2021-11-02
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多