php预定义变量行为取决于sapi类型、php版本和php.ini配置:$_get/$_post是自动初始化的超全局变量;$_server在cli下不包含request_uri;$_session需session_start()才可用;$_env默认为空,需配置variables_order启用。

PHP变量是内存中一个带名字的数据存储单元,用 $ 开头,赋值即创建,类型由值自动决定。
它不是容器编号、不是地址、也不是编译期占位符——就是运行时你随时能读写的那块内存区域,名字是你给它的标签。
$_GET 和 $_POST 为什么不用声明就能用
- 它们属于 PHP 超级全局变量(superglobals),在脚本启动时由 Zend 引擎自动初始化并注入到所有作用域
- 不需要
global $_GET,也不受函数作用域限制,直接$_GET['id']就行 - 但注意:如果请求没带
id参数,$_GET['id']会触发Undefined array key警告(PHP 8.1+) - 正确写法是先判断:
isset($_GET['id'])或用空合并操作符$_GET['id'] ?? ''
$_SERVER['REQUEST_URI'] 在 CLI 模式下不存在
-
$_SERVER是 Web SAPI(如 Apache、FPM)提供的环境映射,CLI 模式下只包含基础字段(如argv、argc、PHP_SELF) - 如果你在命令行跑一个本该用于 Web 的脚本,访问
$_SERVER['REQUEST_URI']会报Undefined array key "REQUEST_URI" - 解决办法:加兜底判断,例如
$_SERVER['REQUEST_URI'] ?? '/cli-mode',或用php_sapi_name() === 'cli'分支处理
$_SESSION 使用前必须 session_start()
-
$_SESSION不是“一直存在”的变量,它依赖 session 存储机制(文件、Redis 等)和会话 ID 传递(通常是 Cookie) - 忘记调用
session_start(),$_SESSION就是空数组,写入无效,读取也拿不到之前存的值 - 常见错误:
- 在
session_start()前输出了任何内容(包括空格、BOM、echo) - 多次调用
session_start()(PHP 7.2+ 会警告) - 在 header 已发送后才调用(导致
headers already sent)
- 在
$_ENV 默认不自动填充
- PHP 默认关闭
variables_order中的E,所以$_ENV通常为空数组,即使系统环境变量已设置 - 要启用它,需在
php.ini中设variables_order = "EGPCS"(E 表示 ENV),或用getenv('PATH')直接取 - 更现代的做法是用
$_SERVER(它默认包含大部分环境变量)或 DotEnv 库加载配置
真正容易被忽略的是:预定义变量的行为高度依赖 SAPI 类型、PHP 版本、php.ini 配置三者组合。同一段代码,在 Web 和 CLI 下、PHP 7.4 和 8.2 下、FPM 和 CGI 下,$_SERVER 的键可能差一半。别硬记哪些键一定有,每次用前查一下 isset() 或给默认值。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











