unset($GLOBALS['x']) 彻底删除全局变量,global $x; unset($x) 仅销毁函数内别名;引用赋值会使 global 失效,动态变量名只能用 $GLOBALS 实现。

unset() 会彻底删除全局变量还是只删别名
这是最常踩坑的点:unset($GLOBALS['x']) 直接从全局作用域中抹掉变量 $x,之后任何地方访问都会触发 Notice: Undefined variable;而 global $x; unset($x) 只销毁函数内那个“别名”,外部 $x 完全不受影响。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 需要真正清理全局状态(比如重置配置缓存)→ 必须用
unset($GLOBALS['key']) - 只是想在函数里“假装没这个变量” →
global $x; unset($x)可行,但意义不大,通常不如直接改值 - 写单元测试时尤其要注意:用
global清理后断言$x仍存在,是预期行为,不是 bug
引用赋值(&)会让 global 失效
global $a, $b; $b = &$a; 这行代码执行后,$b 就不再指向全局 $b,而是变成对 $a 的局部引用。后续修改 $b 不会影响外部 $b,却会改变 $a —— 这和直觉相反。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 如果目标是让全局
$b和$a绑定(即改一个另一个也变)→ 必须写$GLOBALS['b'] = &$GLOBALS['a']; - 避免在同一个函数里混用
global和&,极易造成变量关系失控 - PHP 7.4 至 8.5 均保持该行为,不是版本 bug,是语言设计使然
动态变量名只能靠 $GLOBALS 实现
global 后面必须写死变量名,不支持表达式或拼接;而 $GLOBALS 是数组,键名可计算,比如 $key = 'user_' . $id; $GLOBALS[$key] = $data;。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 处理批量配置项、运行时生成的变量名 → 只能用
$GLOBALS - 写插件或框架时需兼容用户自定义钩子变量 →
$GLOBALS是唯一可靠方式 - 不要试图用
global ${'var_'.$i},语法错误,PHP 不允许
性能和可读性取舍
两者底层开销几乎一致,差异在于语义清晰度和维护成本。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 简单读写(如
global $config; $config['debug'] = true;)→global更简洁 - 涉及
unset、&、动态键、或需要明确“操作的是全局本体” → 无条件选$GLOBALS - 团队协作时,遇到
global+ 引用赋值的代码,务必加注释说明“此处已脱离全局绑定”
& 重绑定,它就彻底“叛逃”出全局作用域,再怎么改都不会反馈回去——这不是 bug,是 PHP 引用机制和 global 别名模型共同决定的刚性行为。



















