php超全局变量共9个,但稳定可用的仅7个:$_get、$_post、$_cookie、$_files、$_session、$_request、$globals;$_server部分键可靠,$_env默认为空。

PHP超全局变量有哪些,哪些真能直接用
PHP里标称“超全局”的变量有9个,但实际项目中真正稳定可用、无需额外声明就能在任意作用域访问的只有7个。$_SERVER和$_ENV受配置影响极大,尤其$_ENV在大多数现代PHP-FPM部署下默认为空——不是你写错了,是它根本没被填充。
-
$_GET、$_POST、$_COOKIE、$_FILES、$_SESSION、$_REQUEST:行为稳定,可直接读取(注意$_REQUEST顺序受request_order配置控制) -
$GLOBALS:严格意义上不算“超全局”,它是所有全局变量的引用容器,但确实无需global声明就能访问其他全局变量 -
$_SERVER:可用,但部分键(如SCRIPT_NAME)可靠,HTTP_*类键(如HTTP_USER_AGENT)可能被禁用(variables_order未含E) -
$_ENV:默认不填充,除非显式设置variables_order = "EGPCS"且Web服务器透传环境变量(Nginx需fastcgi_param逐个传递)
$_REQUEST到底合并了什么,为什么有时拿不到POST数据
$_REQUEST不是简单合并$_GET+$_POST+$_COOKIE,它的实际内容由php.ini中的request_order决定,默认值是"GP"(即只含GET和POST),$_COOKIE被排除在外。更关键的是:当GET和POST同时存在同名参数时,后出现的会覆盖前一个——顺序由request_order字符串位置决定。
- 若
request_order = "GPC",则$_COOKIE['id']会覆盖$_POST['id'](如果两者都存在) - Apache模块模式下,
$_REQUEST还可能包含$_FILES的文件名字段(非文件内容),但CLI或FPM下通常不包含 - 不要依赖
$_REQUEST做关键参数判断,尤其涉及安全校验时——明确用$_POST或$_GET更可控
$_SESSION必须session_start()之后才能用,但错误常发生在哪
调用$_SESSION前未执行session_start()会导致Notice(Undefined variable: _SESSION)甚至空白页(因输出已发送)。但真正难排查的是“看似调用了却无效”的情况:
- 页面顶部有空格、BOM头或
echo提前输出,导致session_start()失败(报headers already sent),但$_SESSION仍可读写——只是不会持久化 - 多个
session_start()连续调用不报错,但第二次起会警告Session started already,且可能干扰session_id生成逻辑 - 使用
session_name('myapp')后,必须在session_start()前调用,否则新名称不生效,仍用默认PHPSESSID
为什么$_SERVER['REQUEST_URI']和$_SERVER['PATH_INFO']经常对不上
这两个变量来源不同:$_SERVER['REQUEST_URI']是原始HTTP请求行里的URI(如/user/profile?id=123),而$_SERVER['PATH_INFO']是Web服务器(如Apache或Nginx)根据index.php重写规则解析出的“路径附加部分”,它不包含查询参数,也不保证存在。
立即学习“PHP免费学习笔记(深入)”;
- Nginx配置
try_files $uri $uri/ /index.php?$query_string时,PATH_INFO为空;改用fastcgi_split_path_info才能正确提取 - Apache的
mod_rewrite中,[QSA]标志会影响QUERY_STRING拼接,但不改变PATH_INFO本身 - 在CLI模式下运行Web脚本时,
$_SERVER大部分键为模拟值,REQUEST_URI可能不存在或为/,不能当作真实请求路径用
超全局变量不是银弹,它们的可用性高度依赖SAPI类型、php.ini配置和Web服务器行为。写代码时别假设某个键一定存在,先isset()再用,比事后调试快得多。











