php超全局变量无需global声明即可全局使用,包括$_get、$_post(区分url参数与表单提交)、$_session与$_cookie(服务端vs客户端状态管理)、$_server(环境与请求信息)、$_files(文件上传)和$globals(全局变量引用),需注意安全风险与正确用法。

PHP 超全局变量是面试高频考点,核心在于理解“超全局”的含义(无需 global 声明即可在任意作用域直接使用)、区分各变量的来源与典型用途,并能识别常见误用和安全风险。
$_GET 和 $_POST:最常考的输入来源区别
$_GET 获取 URL 查询参数(如 ?id=123),数据可见、长度受限、易被篡改;$_POST 获取表单 POST 提交数据(通常来自 application/x-www-form-urlencoded 或 multipart/form-data),适合传敏感或大量数据。
- 注意:$_REQUEST 默认包含 $_GET、$_POST、$_COOKIE,但顺序可由 variables_order 配置决定,不建议依赖它——容易引发覆盖或混淆
- 不要直接输出 $_GET['name'] 到 HTML,必须 htmlspecialchars() 或其他方式转义,否则 XSS 风险
- $_POST 不会自动解析 JSON 请求体;若前端用 fetch(..., { body: JSON.stringify(...) }),需用 file_get_contents('php://input') 手动读取并 json_decode()
$_SESSION 和 $_COOKIE:状态管理的关键差异
$_SESSION 服务端存储(默认存在文件中),靠 session_id 关联用户;$_COOKIE 是客户端存储的键值对,随每次请求发送到服务端。
- session_start() 必须在任何输出前调用,否则报错;开启后 $_SESSION 才可用
- $_COOKIE 中的数据可被用户直接修改,绝不可信任;$_SESSION 数据相对可控,但仍需防范会话固定(Session Fixation)和会话劫持
- 设置 Cookie 用 setcookie(),且同样需在输出前;$_COOKIE 只反映请求头中已有的 Cookie,不会实时同步 setcookie() 的结果
$_SERVER:获取运行环境与请求上下文
包含服务器信息、请求路径、HTTP 头等,是调试和路由判断的重要依据。
立即学习“PHP免费学习笔记(深入)”;
- 常用键:$_SERVER['REQUEST_URI'](原始请求路径)、$_SERVER['PHP_SELF'](当前脚本名)、$_SERVER['HTTP_USER_AGENT'](浏览器标识)、$_SERVER['REMOTE_ADDR'](客户端 IP)
- 注意:$_SERVER['REMOTE_ADDR'] 可被代理伪造;真实 IP 可能藏在 $_SERVER['HTTP_X_FORWARDED_FOR'] 或 $_SERVER['HTTP_X_REAL_IP'] 中,但这些头也可被恶意构造,需结合可信代理名单验证
- $_SERVER['SCRIPT_FILENAME'] 和 __FILE__ 含义不同:前者是 Web 服务器解析后的绝对路径,后者是当前 PHP 文件的路径(更可靠)
$_FILES 和 $GLOBALS:上传处理与全局作用域陷阱
$_FILES 专门处理文件上传,结构为二维数组('name'、'type'、'tmp_name'、'error'、'size');$GLOBALS 是指向所有全局变量的引用数组,慎用。
- 上传失败时 $_FILES['file']['error'] !== UPLOAD_ERR_OK,需检查错误码(如 1 表示 php.ini 中 upload_max_filesize 超限)
- 临时文件存于 tmp_name,必须用 move_uploaded_file() 移动,不能用 copy() 或 rename() —— 出于安全隔离机制限制
- $GLOBALS['var'] 等价于 global $var; echo $var;,但过度依赖会降低可读性、增加耦合;函数内修改 $GLOBALS['x'] = 5 相当于改变了全局变量 $x,容易引发意外副作用











