最稳妥方式是直接修改 $globals;它无需声明、无警告、全版本兼容,且支持动态键名,但赋值后普通变量名仍不可用,需额外 global 声明。

php 函数里直接改 $GLOBALS 是最稳妥的方式
PHP 函数默认作用域隔离,局部变量改不了外部变量。想改全局变量,$GLOBALS 是唯一不依赖声明、不触发警告、全版本兼容的路径。
常见错误现象:Notice: undefined variable 或改了没生效,往往是因为只写了 $var = ... 却没告诉 PHP 这个 $var 是全局的。
-
$GLOBALS['my_config'] = 'new_value';—— 直接写,不用global声明,也不用担心变量名冲突 - 如果变量名是动态的(比如从配置键拼出来的),
$GLOBALS[$key] = $value;也能安全运行 - 注意:不能用
$GLOBALS给未定义的键赋值后,再用普通变量名访问——$GLOBALS['x'] = 1;后,$x仍不可用,除非额外global $x;
用 global 关键字要小心变量名硬编码和作用域陷阱
global 不是“声明全局变量”,而是“把同名全局变量引入当前作用域”。它容易在重构或嵌套函数中失效。
使用场景:函数逻辑简单、变量名固定、且确定不会被重命名或提取到其他文件时,可读性略好于 $GLOBALS。
立即学习“PHP免费学习笔记(深入)”;
-
global $db_host, $db_port;—— 多个变量要列全,漏一个就还是局部变量 - 在匿名函数里用
global会报错,必须用use+ 引用(use (&$var)) - 如果函数里先写了
$db_host = 'xxx';再写global $db_host;,PHP 会忽略global声明,$db_host仍是局部的
静态变量或 return 比修改全局更可控
真正需要“改状态”的场景其实不多。多数时候所谓“改全局”,本质是缓存、配置切换或单次初始化——这些用返回值或静态变量更干净。
性能 / 兼容性影响:避免全局变量污染能显著降低调试难度,尤其在 composer 包混用、单元测试隔离时。
- 配置类用静态属性:
Config::$timeout = 5000;,比改$GLOBALS['timeout']更明确意图 - 初始化逻辑封装成函数并
return结果,由调用方决定是否赋给全局变量,控制权在外层 - 函数内用
Static $cache = NULL;缓存计算结果,比反复读写全局变量更安全
$_SERVER、$_ENV 这类超全局数组不能用 global 修改
超全局数组($_GET、$_POST、$_SERVER 等)在函数内可直接读写,但 global $_SERVER; 是无效语法,PHP 会报 Parse Error。
错误现象:写 global $_SERVER; 后代码直接解析失败,不是警告,是致命错误。
- 直接改:
$_SERVER['PATH_INFO'] = '/api/v2';—— 合法,但仅影响当前请求生命周期 - 别试图用
$GLOBALS['_SERVER']替代,$_SERVER是特殊符号,$GLOBALS里对应的是$_SERVER(带美元符),不是字符串'_SERVER' - 修改
$_ENV需确保variables_order配置包含E,否则写入无效
事情说清了就结束。真要改全局变量,优先选 $GLOBALS;但更该花时间想想——这个“全局”是不是本来就不该存在。