PHP函数内用$var=赋值的变量默认为局部变量,仅在函数执行期存在且与外部同名变量完全隔离;参数、闭包use值拷贝等均遵循此规则,销毁指符号表清除而非立即内存释放。

PHP 函数内部用 $var = 赋值的变量,默认就是 local(局部)变量,它只在函数执行期间存在,函数返回后立即销毁——这不是可选项,是语言强制行为。
函数内直接赋值就是 local 变量
只要没加 global 或 static,$x = 10; 这种写法就一定是 local 变量。它和外部同名变量完全隔离,改它不影响外面,读它也绝不会“自动 fallback”到全局(除非你漏写了 global,那 PHP 会静默去查全局,但这是错误行为,不是设计意图)。
- 常见错误现象:
echo $count;放在函数末尾能输出,但函数调用完再echo $count;就报Notice: Undefined variable - 嵌套
foreach时,内层用了&$item却没unset($item),会导致外层同名变量被意外覆盖 - 函数参数如
function foo($name) { ... }中的$name也是 local 变量,哪怕调用时传的是$name = 'abc',函数内改$name也不会影响外部
local 变量不能靠 global “提升”成全局
有人误以为在函数里写 global $x; 再 $x = 10; 是“把 local 变量变成 global”,其实不是:这行 global $x; 声明的是“我要访问已存在的全局变量 $x”,如果全局没有 $x,PHP 会自动创建一个,但它从一开始就不属于这个函数的 local 作用域。
- 真正 local 的变量,函数一退出就没了,
global对它无效 -
$GLOBALS['x'] = 10;看似绕过global,但本质一样:操作的是全局符号表,不是 local 变量本身 - 想让函数影响外部状态,最干净的方式是
return,比如return ['count' => $count, 'items' => $list];
闭包里的 use 不是 local 变量,是快照
匿名函数里写 function () use ($x) { ... },这个 $x 不是 local 变量,而是定义闭包那一瞬间的值拷贝(PHP 7.4+ 支持 use ($x = $x) 显式按值捕获)。它不随外部 $x 变化,也不参与函数 local 作用域的生命周期管理。
立即学习“PHP免费学习笔记(深入)”;
- 常见错误:在
for ($i = 0; $i < 3; $i++) { $funcs[] = function () use ($i) { echo $i; }; }中,所有闭包最后都输出3,因为$i循环结束后才被捕获 - 修复方法:用
use ($i = $i)强制每次迭代捕获当前值,或改用array_map避免手动管理闭包 - 如果是对象,
use ($obj)拷贝的是引用,改$obj->prop会影响原对象;但如果是数组,use ($arr)是深拷贝,改它不影响外部
最容易被忽略的一点:local 变量的“销毁”不是立即内存释放,而是符号表条目清除。如果有其他变量(比如引用、$GLOBALS 条目、闭包 use)还指向同一块数据,那数据本身仍存活——unset() 也只是解绑名字,不是删数据。



















