结论:global 是创建局部别名,$globals 是直接访问全局变量本体;global $var 赋值或 unset 不影响外部变量存在性,而 $globals['var'] 的赋值、unset 或引用绑定均直接作用于全局变量本身。

直接说结论:在 PHP 7.4 中,global 是关键字,用于在函数内“引入”外部变量的引用;$GLOBALS 是超全局数组,直接映射到全局作用域的变量本身。二者行为本质不同,不是写法差异,而是引用 vs 值/地址本身的区别。
global $var 是别名,不是变量本身
在函数里写 global $var,相当于创建了一个局部变量 $var,它指向外部同名变量的内存地址(即引用)。这个局部 $var 和外部 $var 共享值,但不等价于外部变量实体。
- 对
$var赋新值(如$var = 'new')会同步更新外部变量 - 但用
unset($var)只销毁函数内的这个别名,不影响外部变量 - 用
$var = &$other会让这个别名指向别的变量,从而“断开”与原始全局变量的联系
$GLOBALS['var'] 永远指向全局变量本体
$GLOBALS['var'] 不是别名,它就是全局变量 $var 在内存中的直接入口。任何对它的操作,都作用于那个变量本身。
-
$GLOBALS['var'] = 'new'→ 外部$var立刻变更为'new' -
unset($GLOBALS['var'])→ 真的从全局作用域删除$var,后续访问会报Notice: Undefined variable -
$GLOBALS['var'] = &$GLOBALS['other']→ 让$var和$other成为互相引用的同一块内存
引用赋值时行为差异最明显
这是最容易踩坑的地方:当你在函数里做引用赋值,global 和 $GLOBALS 的结果完全不同。
<?php $var1 = 'a';
$var2 = 'b';
function with_global() {
global $var1, $var2;
$var2 = &$var1; // $var2 别名现在指向 $var1 的地址
}
with_global();
echo $var2; // 输出 'b' —— 原始 $var2 没被改,只是函数内别名变了
function with_globals() {
$GLOBALS['var2'] = &$GLOBALS['var1']; // $var2 本身被重绑定为 $var1 的引用
}
with_globals();
echo $var2; // 输出 'a'
?>
- 用
global做= &,只影响函数内别名的指向,不改变外部变量关系 - 用
$GLOBALS['var'] = &,直接修改全局变量的引用目标,效果穿透整个作用域 - PHP 7.4 对引用语义没有变更,该行为与 PHP 5.6 至 8.x 一致
性能和可读性建议
两者性能差异可忽略,但意图表达和维护成本差别很大:
- 仅需读写值时,
global $x, $y更简洁,适合简单场景 - 需要
unset、引用重绑定、或动态变量名(如$key = 'user_' . $id)时,必须用$GLOBALS[$key] - 多人协作或复杂逻辑中,
$GLOBALS更明确——它不隐藏“这是全局变量”的事实,而global容易让人误以为只是“声明一下可用” - 注意:
$GLOBALS数组本身不可 unset,但其中的键可以;global后面不能跟表达式或数组下标,只能是纯变量名
真正容易被忽略的是:你写的 global $x 并没让 $x “变成全局”,它只是把函数外的 $x 拉进来当个本地别名——一旦你给这个别名重新赋引用,它就和原来的 $x 彻底脱钩了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











