超全局变量

超全局变量超全局变量是在全部作用域中始终可用的内置变量

说明

PHP 中的许多预定义变量都是"超全局的",这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们。

这些超全局变量是:

更新日志

版本 说明
4.1.0 超全局变量被引入到 PHP.

注释

Note: 变量可用性

默认情况下,所有的超全局变量都是可用的。但是,有一些指令会影响这种可用性。更多信息,参见文档 variables_order.

Note: 处理 register_globals

如果已经弃用的 register_globals 指令被设置为 on 那么局部变量也将在脚本的全局作用域中可用。例如, $_POST['foo'] 也将以 $foo 的形式存在。

相关信息,参见 FAQ "register_globals 对我有什么影响?"

Note: 可变变量

在函数或类方法中,超全局变量不能被用作可变变量

User Contributed Notes

mife 05-Sep-2019 05:40
// You do need global in this special situation

function get_var($varname){
  global $$varname;
  echo $$varname;
}

show_var('_POST');
php (a) timstamp.co.uk 14-Sep-2017 08:32
For those wondering if register_globals also makes global variables available inside functions - it doesn't.

Running this code on a PHP52 webserver with register_globals enabled, using url:
http://localhost?hello=campers

<?php
function abc() {
    echo
"in func: '$hello' \n"; // outputs "in func: '' "
}
echo
"global: '$hello' \n"; // outputs "global: 'campers' "
abc();
kitchin 14-May-2013 06:09
Since PHP 5.4, you cannot use a superglobal as the parameter to a function. This causes a fatal error:

function foo($_GET) {
  // whatever
}

It's called "shadowing" a superglobal, and I don't know why people ever did it, but I've seen it out there. The easy fix is just to rename the variable $get in the function, assuming that name is unique.

There was no deprecation warning issued in previous versions of PHP, according to my testing, neither in 5.3 nor 5.2. The error messages in 5.4 are:
Fatal error: Cannot re-assign auto-global variable _GET in...
Fatal error: Cannot re-assign auto-global variable _COOKIE in...
etc.