PHP闭包必须用use显式捕获外部变量,否则报Undefined variable错误;默认按值传递,修改外部变量需用use(&$v),且不支持直接use超全局变量或$this->xxx。

必须用 use 显式捕获,否则直接访问会报 Undefined variable 错误——这不是可选项,是 PHP 作用域机制决定的硬性规则。
闭包访问外部变量报 Undefined variable
常见错误现象:在 array_map、usort、where(function () {}) 等回调中直接写 $order_by 或 $limit,运行时报错 Undefined variable: xxx。
- PHP 匿名函数不继承父作用域,哪怕变量就在上一行定义,也完全不可见
-
use是唯一合法通道,漏写就是漏掉整个变量 - 不能
use $_POST或use $this->data,超全局和对象属性需先赋值给局部变量再传入
use($var) 和 use(&$var) 的区别
按值传递(默认)只读副本,按引用传递才能修改外部变量本身。
-
use ($count):闭包内$count++只改副本,外部$count仍是原值 -
use (&$count):闭包内递增会真实更新外部变量,适用于统计、收集、状态同步等场景 - 多个变量用逗号分隔:
use ($a, $b, &$c),混合值/引用可同时存在
在 Laravel 查询构造器里用 use 传参
Laravel 的 where、orderBy 等接受闭包的地方,最容易忽略 use。
立即学习“PHP免费学习笔记(深入)”;
- 错误写法:
->where(function ($q) { $q->where('status', $status); })→$status未定义 - 正确写法:
->where(function ($q) use ($status) { $q->where('status', $status); }) - 若需动态改
$status值(比如循环中),必须加&:use (&$status) - 注意:Laravel 10+ 支持箭头函数,但箭头函数自动绑定所有变量,不适用于需要精细控制引用的场景
闭包里想维持内部状态,static 更干净
如果只是想让闭包自己记数、不跟外部共享,用 static 比 use (&$x) 更安全。
-
static $counter = 0;在多次调用间保留值,但外部无法读写 - 避免意外污染外部变量,也省去
use语法负担 - 缺点:无法从外部重置或检查当前值,适用封闭型计数逻辑
最常被忽略的是引用传递的必要性——以为 use ($var) 就能改外部值,结果调试半天发现变量始终没变。只要闭包里有 ++、=、[]= 这类赋值操作,先看是不是漏了 &。



















