$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.