**闭包(closure)**是匿名函数(没有名字、存储在变量中的函数)。**可调用项(callable)**是任何 PHP 能像函数那样调用的东西 —— 闭包、具名函数、方法或可调用对象。它们支持函数式风格的编程、回调和高阶函数。
闭包(匿名函数)
= {
* ;
};
();
= * ;
();
闭包是一个可以存储和传递的匿名函数。箭头函数(fn)是一种简洁形式,会自动捕获外层变量。
$factor = 10;
// traditional closure — must explicitly import variables with `use`
$multiply = function (int $x) use ($factor): int {
return $x * $factor; // $factor captured by value
};
// arrow function — captures outer variables AUTOMATICALLY (no `use` needed)
$multiply = fn(int $x): int => $x * $factor;
关键区别在于:传统闭包需要显式的 use 子句来捕获外层变量,而箭头函数会自动捕获它们 —— 对于简短的回调来说这是个很大的便利。
// these are all callables, usable as callbacks:
'strlen' // a string naming a function
[$object, 'methodName'] // [object, method] array
['ClassName', 'staticMethod'] // [class, static method]
fn($x) => $x * 2 // a closure/arrow function
$invokableObject // an object with __invoke()
// used with higher-order functions:
array_map(fn($x) => $x * 2, [1, 2, 3]); // [2, 4, 6]
array_filter($users, fn($u) => $u->isActive()); // filter
usort($items, fn($a, $b) => $a->price <=> $b->price); // custom sort
callable 是用于参数的类型提示,表示接受任何可调用项 —— 从而支持高阶函数(接收函数的函数),它是 array_map/array_filter/usort 以及基于回调的 API 的基础。
闭包和可调用项是 PHP 的重要特性,它们支持函数式风格的编程、回调和高阶函数 —— 这些都是现代 PHP 中频繁使用的模式。
理解闭包(存储在变量中的匿名函数),尤其是箭头函数(fn,它会自动捕获外层变量,不像传统闭包那样需要显式的 use 子句),是日常知识,因为它们是编写那些传递给数组函数(array_map/array_filter/array_reduce)、自定义排序(usort)、事件处理器和基于回调的 API 的简短内联函数的自然方式。
懂得什么算是可调用项(具名函数、方法、静态方法、闭包、可调用对象)以及高阶函数如何接受它们,是写出干净、函数式风格的 PHP 代码并使用众多接受回调的框架和标准库 API(路由处理器、集合方法、中间件)的关键。
闭包和可调用项是富有表现力的现代 PHP 的基础 —— 它们让数据转换、过滤、排序和回调模式变得简洁易读 —— 因此掌握它们,尤其是便捷的箭头函数语法以及 use 捕获与自动捕获的区别,是高效 PHP 开发中实用且常用的知识。