$globals 在 php 7.1 中直接操作符号表,比 global 更确定可控:$globals['x'] 始终同步修改原始变量,支持未定义变量创建与销毁,但不支持变量变量语法且键名需为字符串字面量或变量值。

$GLOBALS 在 PHP 7.1 中读写外部变量,核心优势不是“更方便”,而是“更确定、更可控”——它绕开了 global 的引用映射机制,直接操作符号表,避免了作用域混淆和意外覆盖。
为什么 $GLOBALS['x'] 比 global $x 更可靠
两者表面都能访问全局变量,但底层行为完全不同:
-
global $x是在当前函数作用域内创建一个指向外部$x的别名(类似引用),但这个别名可以被重新赋值而断开连接。比如$x = []; $x = new StdClass();后,外部$x不受影响 -
$GLOBALS['x']始终是对外部变量本身的直接访问。任何读写都同步到原始变量,不存在“别名失效”问题 - PHP 7.1 对
$GLOBALS的数组元素读写完全支持(只读/读写都 OK),且没有global那种依赖变量是否已定义的隐式前提
PHP 7.1 中 $GLOBALS 写入全局变量的实际效果
在函数里用 $GLOBALS['config'] = [...],等价于在全局作用域执行了赋值,不是“复制”或“映射”:
- 修改后,所有后续对
$config的访问(包括其他函数里用global $config)都会看到新值 - 即使该变量此前未定义,
$GLOBALS['new_var'] = 'ok';也会在全局作用域创建它(PHP 7.1 兼容) - 注意:
unset($GLOBALS['x'])会真正销毁全局变量$x,而unset($x)在global $x下只是删掉别名,不影响原变量
容易踩的坑:$GLOBALS 不是万能解药
它解决的是 global 的不确定性,但引入了新的风险点:
- 不能用变量变量语法访问:
$$var中$var = 'GLOBALS'会报Undefined variable: GLOBALS,这是 PHP 语言级限制,PHP 7.1 到 8.5 都一样 -
$GLOBALS键名必须是字符串字面量或变量值,不能是表达式:$GLOBALS[$prefix . '_db']可以,但$GLOBALS[func_name()]在某些上下文可能触发 Notice(取决于严格模式) - PHP 8.1+ 开始禁止对整个
$GLOBALS数组写操作(如$GLOBALS = []),但 PHP 7.1 仍允许——如果你的代码未来要升级,得提前规避这类写法
真正难处理的从来不是“怎么让函数改全局变量”,而是“谁在什么时候改了它,改成了什么”。用 $GLOBALS 至少能保证你写的那一行,就是真实发生的变更;而 global 的别名机制,会让调试时看到的值和实际内存里的值不一致。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











