局部变量仅在函数内有效,执行完即销毁;全局变量需用global或$GLOBALS显式声明才能在函数内访问,否则会静默创建同名局部变量。

PHP里局部变量和全局变量根本不是“能不能用”的问题,而是“在哪能用、怎么用、用完会不会留尾巴”的问题。
局部变量只能在函数内部定义和访问
函数一执行完,它就没了,连内存都还给系统了。你试图在函数外 echo $local_var,PHP 直接报 Undefined variable —— 不是忘了声明,是压根没这个变量的“户口”。
- 同名变量在不同函数里互不干扰:
funcA()里的$count和funcB()里的$count是两个独立个体 - 形参(比如
function foo($x)中的$x)也是局部变量,只活在foo()执行期间 - 别指望靠“外部赋值”让局部变量逃逸出去——没返回值、没引用传递,它就真的只存在那几行代码里
全局变量不能直接在函数内读写
你在脚本开头写了 $config = ['debug' => true];,进到函数里直接 echo $config;?不行。PHP 默认把它当全新局部变量处理,结果就是 Undefined variable。
- 必须显式声明:用
global $config;或者$config = $GLOBALS['config']; -
global是“绑定”,不是“拷贝”——改了它,外面的$config真的会变 -
$GLOBALS更底层,不用提前声明,但写法啰嗦;global更直觉,但容易漏写或写错变量名 - 如果函数里既有
global $x;又有$x = 123;,那改的就是全局的$x;但如果漏了global,$x = 123;就只是新建一个局部$x,全局那个纹丝不动
生命周期和内存位置差异直接影响调试逻辑
局部变量在栈上分配,函数调用开始才出生,return 或 } 结束就销毁;全局变量从脚本加载起就躺在静态存储区,直到整个请求结束才释放。这意味着:
立即学习“PHP免费学习笔记(深入)”;
- 递归函数里反复声明同名局部变量,每次都是新空间、新值,不会串
- 全局变量被多个函数反复修改,谁动的、什么时候动的、动成了啥,得靠日志或调试器追——尤其在长生命周期的 CLI 脚本或 Swoole 服务里,不
unset()它可能一直占着内存 - PHP 8.5.5 没改这个机制,所有版本行为一致;但如果你用
static $x = 0;,那它既在函数内又跨调用存活,属于另一套规则,别和全局变量混着想
最容易忽略的一点:全局变量重名时,函数内未声明 global 的同名变量会静默覆盖全局变量的作用——你以为在读配置,其实读的是自己刚建的空壳。这种错误不报错,只悄悄出错。



















