程序写多了,都会认同这条规则:在 WordPress 中,都尽量不要使用全局变量,其实任何 PHP 程序中都是这样的。为什么?先从简单介绍下全局变量开始。
什么是全局变量
全局变量是在 PHP 脚本的任何作用域中都可以访问的变量,主要包括以下几种形式:
超全局变量 (Superglobals)
PHP 预定义的全局数组,无需使用 global 声明即可在任何作用域访问:
$_GET:HTTP GET 请求参数
$_POST:HTTP POST 请求参数
$_REQUEST:GET/POST/COOKIE 的合并数据
$_SESSION:会话数据
$_COOKIE:客户端 Cookie 数据
$_SERVER:服务器和执行环境信息
$_FILES:上传文件信息
$_ENV:环境变量
$GLOBALS:所有全局变量的引用集合
使用 global 关键字
在函数或方法内部通过 global 关键字访问全局变量:
$globalVar = 10;function test() { global $globalVar; echo $globalVar; // 输出 10}
$GLOBALS 数组
直接通过 $GLOBALS 访问全局变量:
$globalVar = 10;function test() { echo $GLOBALS['globalVar']; // 输出 10}
使用全局变量的问题
代码可维护性差
隐式依赖:函数内部依赖全局变量会导致代码逻辑不透明,难以追踪数据来源。
耦合度高:修改全局变量可能影响多个地方,引发难以调试的副作用。
作用域污染
命名冲突:全局变量可能与其他变量或库中的变量同名,导致意外覆盖。
生命周期不可控:全局变量在脚本结束前一直存在,可能占用不必要的内存。
并发和线程安全问题
在并发环境(如多线程或异步任务)中,全局变量可能被多个线程同时修改,导致数据不一致。
测试困难
全局状态使得单元测试难以隔离,测试用例之间可能互相影响。
安全隐患
超全局变量(如 $_GET、$_POST)未过滤时可能引发安全漏洞(如 SQL 注入、XSS)。
全局变量虽然方便,但过度使用会导致代码质量下降。应该遵循“最小作用域原则”和“单一职责原则”,能显著提升代码的可维护性和安全性。
在 WordPress 中正确使用全局变量
但是我们在代码中还是要使用一些全局变量,或者类似全局变量的变量,比如我在小程序中记录当前登录的用户的 openid:$weapp_openid。那么怎么办呢?
先上代码:
function wpjam_var($name, ...$args){ static $vars; $vars ??= wpjam_parse_user_agent(); // 当前用户访问的环境信息 if($args && (!isset($vars[$name])