PHP函数默认隔离全局变量,需用global声明或$GLOBALS数组访问;global建立引用绑定且仅限当前函数,$GLOBALS适用于只读和动态变量名场景,闭包则须用use捕获变量。

PHP函数内直接访问全局变量会报错
PHP函数作用域默认隔离全局变量,直接写$GLOBALS['var_name']能读,但写$var_name会当作局部变量处理,值为空或未定义。这不是语法错误,而是行为陷阱——尤其在调试时发现变量“突然没了”,其实只是没声明引用。
用global关键字声明后才能修改全局变量
想在函数里读写同名全局变量,必须显式用global声明。它不是复制值,而是建立引用绑定:
$count = 0;
function increment() {
global $count;
$count++;
}
increment();
echo $count; // 输出 1
-
global只在当前函数生效,不影响其他函数 - 多个变量用逗号分隔:
global $a, $b, $c; - 不能在
global后接表达式,比如global $arr['key']非法 - 若全局变量是超全局(如
$_POST),global $_POST无效,必须用$_POST原样访问
更安全的替代方案:用$GLOBALS数组
$GLOBALS是PHP内置超全局数组,键名为全局变量名,始终可用,不依赖global声明:
$user_id = 123;
function log_user() {
error_log('User: ' . $GLOBALS['user_id']);
}
- 适合只读场景,避免意外修改全局状态
- 动态拼接变量名时唯一选择,比如
$var_name = 'config_' . $env; echo $GLOBALS[$var_name]; - 性能上比
global略低(数组查找 vs 符号表绑定),但差异可忽略 - 注意键名是字符串,
$GLOBALS['$user_id']写法错误,应为$GLOBALS['user_id']
闭包里用use捕获外部变量更可控
匿名函数无法用global,也不能直接读外层变量,必须用use显式传入:
立即学习“PHP免费学习笔记(深入)”;
$timeout = 30;
$handler = function ($url) use ($timeout) {
return file_get_contents($url, false, null, -1, $timeout);
};
-
use默认按值传递,加&可引用:use (&$counter) - 不能
use超全局数组本身,但可以use ($_SERVER)传副本 - 若需同时访问全局和参数同名变量,
use能避免歧义,比global语义更清晰
global和$GLOBALS只是让问题“能跑”,真正要留意的是:函数是否真的需要改全局?多数时候把变量作为参数传入、返回新值,反而更易测、更少副作用。



















