$GLOBALS['var_name']最稳,global $var次之;PHP严格隔离作用域,函数内未声明无法访问外部变量,超全局变量除外,$GLOBALS是真实引用,global需在函数顶层声明且名必须一致。

直接用 $GLOBALS['var_name'] 最稳,global $var 次之;别指望不加任何声明就能读到——PHP 7.3 仍严格隔离作用域。
为什么函数里直接写 $config 会报 Notice: Undefined variable
PHP 函数默认不继承外部变量,哪怕变量在同一个文件顶部定义了。这不是 bug,是设计:作用域隔离防止意外覆盖。你看到的空值或 notice,本质是变量根本没进函数作用域。
-
$config在函数外定义,但函数内未声明,就等于没存在过 -
$_GET、$_POST这类超全局变量除外,它们天然穿透作用域 - PHP 7.3 不支持自动全局(auto_globals_jit=Off 时也只影响 $_SERVER 等少数,不影响自定义变量)
$GLOBALS 是最无脑可靠的方式
它是个关联数组,键就是全局变量名字符串,值是对应变量的引用。不用提前声明,不依赖顺序,改它等于改原变量。
- 读取:
echo $GLOBALS['db_host']; - 修改:
$GLOBALS['counter']++;—— 全局$counter立刻变 - 动态访问:
$key = 'timeout'; echo $GLOBALS[$key];可行 - 坑点:
$GLOBALS['Config'](大小写错)静默返回null,不会报错,但值拿不到 - PHP 7.3 中
$GLOBALS是真实符号表引用,不是副本,性能无额外负担
global 关键字适合高频读写且变量名固定的场景
它把全局变量“拉进”函数作用域,之后可当普通变量用,写起来比 $GLOBALS[] 短,但绑定逻辑容易翻车。
立即学习“PHP免费学习笔记(深入)”;
- 必须写在函数体第一层,不能包在
if或for里:global $log_level;✔️,if (true) { global $log_level; }❌(语法错误) - 声明后对
$log_level的赋值会同步到全局,但如果是对象,$obj = new StdClass();只改局部引用,原变量不变 - 名字必须完全一致:
global $user;对应外部$current_user?拿不到,也不会报错 - 多个变量用逗号连写:
global $a, $b, $c;等价于三条单独声明
别踩这些坑
超全局变量如 $_SESSION 要先 session_start() 才能用,否则是空数组;$_ENV 默认不可用,除非配置了 variables_order 包含 E;CLI 下 $_SERVER['REQUEST_URI'] 根本不存在;static 变量不是全局变量,它只在单个函数内维持状态,别的函数访问不到。
真正跨函数共享数据,还是得靠 $GLOBALS 或 global,或者干脆改用参数传递、类静态属性——毕竟全局变量本身就意味着隐式依赖,调试和测试都更麻烦。



















