$GLOBALS是PHP7.0中直接访问全局变量的底层机制,比global更透明可控,支持动态键名、遍历和修改超全局数组,且避免引用切断问题。

PHP7.0中用$GLOBALS直接访问全局变量,无需global声明
在函数内部想读写全局变量时,$GLOBALS是global关键字的等效替代——但它不是“替代语法”,而是底层机制本身。global $x本质上就是把$GLOBALS['x']的引用绑定到局部变量$x。所以直接操作$GLOBALS更透明,也更可控。
-
global $user_id→ 等价于$user_id = &$GLOBALS['user_id'] - 直接写
$GLOBALS['user_id'] = 123,就跳过了引用绑定,避免意外覆盖局部同名变量 - 读取时
echo $GLOBALS['config']['debug']比先global $config再echo $config['debug']少一层间接性
什么时候必须用$GLOBALS而不能用global
global只能用于变量名字面量,无法动态拼接;$GLOBALS支持键名计算,这是它不可替代的场景。
- 动态变量名:
$key = 'db_host'; echo $GLOBALS[$key];——global $$key在PHP7.0中不合法 - 遍历全部全局变量:
foreach ($GLOBALS as $name => $value) { ... },global做不到 - 函数内修改超全局数组自身(如
$_SESSION)时,$GLOBALS['_SESSION']可明确指向,而global $_SESSION在某些旧版本有歧义
$GLOBALS和global在性能与作用域上的实际差异
两者编译后几乎无性能差别,但行为细节影响调试和维护。
- 赋值行为不同:用
global $x后对$x重新赋值($x = []),会切断与全局变量的引用关系;而$GLOBALS['x'] = []始终修改原变量 -
$GLOBALS包含所有全局符号,包括$_GET、$_POST、$argc等,但global $_GET在PHP7.0中会触发E_NOTICE(因为$_GET是超全局,无需声明) - 函数内
unset($GLOBALS['x'])会真正销毁全局变量;而unset($x)配合global $x只销毁局部引用
常见误用:把$GLOBALS当“全局命名空间”滥用
它只是个关联数组,不是魔法容器。很多问题源于混淆了“存在”和“可用”。
立即学习“PHP免费学习笔记(深入)”;
-
$GLOBALS['nonexistent']不会报错,但返回NULL(注意不是undefined);用前最好isset($GLOBALS['key'])判断 - 在
include或eval代码中,$GLOBALS反映的是执行时的全局作用域,不是被包含文件的“自有全局变量” - CLI模式下
$GLOBALS['argv']存在,但Web SAPI中不存在;别假设所有键都跨环境可用
最易忽略的一点:PHP7.0开始,$GLOBALS本身是只读的(不能$GLOBALS = []),但它的元素仍可读写——这个限制在调试时容易让人困惑。



















