• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • $GLOBALS

    引用全局作用域中可用的全部变量

    说明

    一个包含了全部变量的全局组合数组。变量的名字就是数组的键。

    范例

    Example #1$GLOBALS范例

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

    以上例程的输出类似于:

    $foo in global scope: Example content
    $foo in current scope: local variable
    

    注释

    Note:

    “Superglobal”也称为自动化的全局变量。这就表示其在脚本的所有作用域中都是可用的。不需要在函数或方法中用global $variable;来访问它。

    Note:变量可用性

    与所有其他超全局变量不同,$GLOBALS在PHP中总是可用的。

    As of PHP 5.4 $GLOBALS is now initialized just-in-time. This means there now is an advantage to not use the $GLOBALS variable as you can avoid the overhead of initializing it. How much of an advantage that is I'm not sure, but I've never liked $GLOBALS much anyways.
    Watch out when you are trying to set $GLOBALS to the local variable.
    Even without reference operator "&" your variable seems to be referenced to the $GLOBALS
    You can test this behaviour using below code
    <?php
    /**
     * Result:
     * POST: B, Variable: C
     * GLOBALS: C, Variable: C
     */
     
    // Testing $_POST
    $_POST['A'] = 'B';
     
    $nonReferencedPostVar = $_POST;
    $nonReferencedPostVar['A'] = 'C';
     
    echo 'POST: '.$_POST['A'].', Variable: '.$nonReferencedPostVar['A']."\n\n";
     
    // Testing Globals
    $GLOBALS['A'] = 'B';
     
    $nonReferencedGlobalsVar = $GLOBALS;
    $nonReferencedGlobalsVar['A'] = 'C';
     
    echo 'GLOBALS: '.$GLOBALS['A'].', Variable: '.$nonReferencedGlobalsVar['A']."\n\n";
    I finally found information about superglobals not being found in $GLOBALS:
    https://bugs.php.net/bug.php?id=65223&edit=2
    -------------------------------------
     [2013-07-09 12:00 UTC] johannes @php.net
    [...]super-globals (aka. auto globals) are not added to symbol tables by default for performance reasons unless the parser sees need. i.e. 
    <?php
    $_SERVER;
    print_r($GLOBALS);
    ?>
    will list it. You can also control this using auto_gloals_jit in php.ini: http://www.php.net/manual/en/ini.core.php#ini.auto-globals-jit
    -------------------------------------
    http://www.php.net/manual/en/language.variables.variable.php
    -------------------------------------
    Warning
    Please note that variable variables cannot be used with PHP's Superglobal arrays within functions or class methods. The variable $this is also a special variable that cannot be referenced dynamically.
    -------------------------------------
    I ran into the case where I needed to know if my script was in the global scope or not.
    You can use $GLOBALS to figure out which case that is:
    <?php // file foo.php
    $some_unique_prefix_foo = "ok";
    if (isset($GLOBALS["some_unique_prefix_foo"])) {
      echo "Foo is in global scope.\n";
    } else {
      echo "Foo is NOT in global scope.\n";
    }
    unset($some_unique_prefix_foo);
    // Inside another file.
    function test() {
      include "foo.php";
    }
    test();
    ?>
    Outputs:
    Foo is in global scope.
    Foo is NOT in global scope.

    上篇:超全局变量

    下篇:$_SERVER