php中匿名函数是定义方式,回调函数是使用方式;匿名函数可作为回调传入usort等函数,需用use捕获外部变量,且必须以分号结尾。

PHP里没有“匿名函数 vs 回调函数”这种对立关系——anonymous function 是函数的**定义方式**,callback 是函数的**使用方式**。两者不是同类比较项,就像“螺丝刀”和“拧螺丝的动作”不是同一类东西。
callback 是一种调用角色,不是函数类型
只要一个函数被当作参数传给另一个函数,并在稍后被调用,它就是 callback。它可能是:
- 字符串形式的函数名:
'array_sum'、'MyClass::staticMethod' - 数组形式的对象方法:
[$obj, 'method']或[new MyClass(), 'method'] - 闭包对象(也就是匿名函数):
function($x) { return $x * 2; }
也就是说,function($a, $b) { return $a $b; } 本身是匿名函数;当它被传给 usort() 时,才同时成为 callback。
匿名函数必须赋值或直接传参,不能 standalone 调用
PHP 的匿名函数不是语句,而是表达式,所以:
- 必须以分号结尾:
$add = function($a, $b) { return $a + $b; }; - 不能写成
function($a) { ... }();(会 parse error) - 想立即执行,得加括号包裹:
(function($x) { echo $x; })(123);
而普通命名函数(比如 function my_handler() { ... })定义后就能直接 my_handler() 调用,不依赖是否被当 callback 用。
use() 是匿名函数作为 callback 时的关键扩展能力
当你需要在回调中访问外部变量(比如配置、数据库连接、上下文状态),又不想全局化或重复传参,use 就是唯一干净的解法:
$multiplier = 5;
$scale = function($n) use ($multiplier) {
return $n * $multiplier;
};
array_map($scale, [1, 2, 3]); // [5, 10, 15]
注意:use 默认按值捕获,如果要修改外部变量,得显式传引用:use (&$count)。这点常被忽略,导致闭包内修改无效。
真正容易混淆的点在于:有人把“字符串函数名传参”叫“回调函数”,把“匿名函数传参”叫“匿名回调”,其实只是 callback 的两种实现形态。核心差异不在“是不是回调”,而在“怎么定义函数”以及“能否捕获作用域”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











