php全局变量需显式声明或通过$globals访问,函数内不声明即视为局部变量;超全局数组如$_get可直接使用;现代项目应避免依赖全局变量以降低维护成本。

PHP 全局变量不是“声明了就能在任何地方用”,关键在于作用域隔离和 global 或 $GLOBALS 的显式介入。
函数内访问全局变量必须加 global 声明
函数内部默认无法读写外部定义的变量,哪怕它叫 $user_id 或 $config。不声明就直接用,PHP 会当作全新局部变量处理,原值不受影响。
常见错误现象:Notice: Undefined variable 或函数里改了值,函数外仍是旧值。
- 在函数开头用
global $var_name;显式挂载(支持多个,用逗号分隔) - 或改用
$GLOBALS['var_name']—— 这是数组形式,无需声明,但写法略冗长 - 注意:仅对普通变量有效;
static变量、闭包里的use、类属性都不走这套逻辑
$count = 0;
function increment() {
global $count;
$count++;
}
increment();
echo $count; // 输出 1
$GLOBALS 是超全局数组,但别滥用
$GLOBALS 是 PHP 内置的超全局数组,键名就是变量名(不含 $),所有作用域都可直接读写。它绕过了 global 声明,但代价是代码可读性下降、调试困难。
立即学习“PHP免费学习笔记(深入)”;
使用场景:极少数需要动态拼接变量名(如 $GLOBALS[$key])或跨多层嵌套函数临时透传时才考虑。
十天学会易语言图解教程用图解的方式对易语言的使用方法和操作技巧作了生动、系统的讲解。需要的朋友们可以下载看看吧!全书分十章,分十天讲完。 第一章是介绍易语言的安装,以及运行后的界面。同时介绍一个非常简单的小程序,以帮助用户入门学习。最后介绍编程的输入方法,以及一些初学者会遇到的常见问题。第二章将接触一些具体的问题,如怎样编写一个1+2等于几的程序,并了解变量的概念,变量的有效范围,数据类型等知识。其后,您将跟着本书,编写一个自己的MP3播放器,认识窗口、按钮、编辑框三个常用组件。以认识命令及事件子程序。第
-
$GLOBALS['db_host']等价于在全局作用域声明的$db_host - 修改
$GLOBALS['x']会真实改变全局变量$x,不是副本 - 性能无差异,但 IDE 很难做变量跳转,静态分析工具常报错
超全局变量($_GET、$_POST 等)不用 global 声明
$_GET、$_POST、$_SESSION、$_SERVER 这些本身就是超全局的,在函数内可直接使用,不需要 global,也不该用 $GLOBALS['_GET'] 去绕。
容易踩的坑:
- 误以为
$_POST需要global $_POST;—— 不用,加了反而多余 - 在函数里直接
unset($_SESSION['token'])是安全的,但要注意 session 是否已启动 -
$_ENV和$_SERVER的内容受 php.ini 中variables_order影响,不能默认全有
现代 PHP 项目中应尽量避免依赖全局变量
不是语法不行,而是协作和维护成本高:变量来源不明确、测试难 mock、并发下易出状态污染(尤其在 CLI 或长连接 Swoole 场景)。
更稳妥的做法:
- 把需要的数据作为参数传入函数,而非靠
global暗渡陈仓 - 配置类统一管理,用依赖注入容器(如
Container::get('config'))替代裸$config - Web 请求上下文封装成
Request对象,而不是散落各处的$_GET直引用
真要用全局变量,务必确保它是只读的、命名带前缀(如 $APP_ENV)、且文档写清生命周期——否则下次你或同事 debug 时,会在某个不起眼的函数里花两小时找谁动了 $cache_ttl。










