最稳妥的方式是使用 $globals 数组访问全局变量,因其在任何作用域都可用、不依赖声明顺序、支持动态键名,且避免 global 声明的拼写错误和语法限制。

函数里直接用 $GLOBALS 数组最稳妥
PHP 的全局变量在函数内部默认不可见,不是“不能用”,而是作用域隔离了。最直白的办法就是通过 $GLOBALS 这个超全局数组访问,它在任何作用域都可用。
常见错误现象:直接写 $config 或 $db_host,函数里报 Undefined variable;或者用了 global $var 却漏写声明,结果读到空值。
-
global声明必须出现在函数体开头,且每个变量都要单独写一次(global $a, $b;不等于global $a; global $b;,但效果一样) -
$GLOBALS['var']不依赖声明顺序,也不怕变量名被覆盖,适合动态取值(比如$key = 'user_id'; echo $GLOBALS[$key];) - 如果全局变量是对象或数组,
global和$GLOBALS都是引用传递,改内容会同步影响外部;但重新赋值($var = new StdClass();)只影响当前作用域
用 global 关键字时,别漏掉变量名拼写和分号
很多人以为写了 global 就万事大吉,结果变量还是空——其实是拼错了名字,或者把逗号写成顿号、漏了分号,导致语法没报错但声明失效。
使用场景:函数逻辑清晰、变量少、命名稳定,比如配置常量 $API_TIMEOUT、连接句柄 $pdo。
立即学习“PHP免费学习笔记(深入)”;
- 检查
global $DB_HOST, $DB_PORT;里的每个变量是否真在全局作用域定义过(var_dump($GLOBALS)可快速确认) - 不要在
if或循环里写global,PHP 不允许条件式声明 - 函数参数名和
global变量名冲突时,参数会覆盖全局变量,除非你明确用$GLOBALS
闭包里用 use 比 global 更安全
匿名函数默认不继承外部变量,global 在里面无效,硬写会报错;这时候得靠 use 显式导入。
性能影响很小,但语义更清晰——你知道这个闭包依赖哪些外部值,而不是靠全局状态隐式耦合。
-
use (&$counter)表示引用传入,闭包内改值会影响外部变量;不加&就是拷贝一份 -
use ($config)中的$config必须在闭包定义时就存在,不能是运行时才生成的变量 - 避免
use ($GLOBALS)——语法错误,$GLOBALS本身不能被use,要用就得写use ($some_var)或改用$GLOBALS['xxx']
别在函数里改 $_GET $_POST 这类超全局变量
虽然 $_GET、$_POST 理论上也能用 global 或 $GLOBALS 修改,但这是危险操作。框架、中间件、后续逻辑可能依赖原始输入,改了会导致难以排查的副作用。
正确做法是复制一份处理:$safe_input = $_POST; $safe_input['id'] = (int)$safe_input['id'];,而不是直接改 $_POST['id']。
- 修改
$_SESSION是常见需求,可以用$_SESSION['user'] = $data;,但注意 session_start() 是否已调用 -
$_SERVER大部分字段只读,强行改(如$_SERVER['REQUEST_URI'])不会影响实际请求,只是局部变量覆盖 - 所有超全局变量都不该被
unset()或重赋为null,PHP 会忽略或触发警告
真正麻烦的不是怎么访问,而是搞不清某个变量到底是不是全局的、谁在什么时候改过它。查问题时优先 var_dump($GLOBALS) 看全貌,比猜变量名靠谱得多。











