本文目录导读:

在 PHP 中,箭头函数(Arrow Functions)是从 PHP 7.4 开始引入的一种更简洁的匿名函数写法,主要特点是自动继承父作用域的变量(不需要写 use)。
基本语法
$variable = fn(参数列表) => 表达式;
对比传统匿名函数
// 传统匿名函数(需要 use 引入外部变量)
$multiplier = 3;
$traditional = function($x) use ($multiplier) {
return $x * $multiplier;
};
// 箭头函数(自动继承 $multiplier)
$arrow = fn($x) => $x * $multiplier;
echo $traditional(5); // 15
echo $arrow(5); // 15
核心特点
自动捕获外部变量(只读)
箭头函数自动继承父作用域的变量,并且不能修改它们:
$count = 0; // 错误!箭头函数不能修改外部变量 $increment = fn() => $count++; // 会报错 // 正确:只能读取 $getCount = fn() => $count;
只能包含单个表达式
箭头函数只能有一个表达式,不能包含多行代码或语句:
// ✅ 正确:单个表达式
$square = fn($n) => $n * $n;
// ❌ 错误:不能使用多行
$complex = fn($n) => {
$result = $n * 2;
return $result + 1;
}; // 会报语法错误
支持类型声明
// 参数类型和返回类型声明 $add = fn(int $a, int $b): int => $a + $b; echo $add(3, 5); // 8
实际应用场景
数组处理(最常用)
$numbers = [1, 2, 3, 4, 5];
// 使用箭头函数简洁地处理数组
$doubled = array_map(fn($n) => $n * 2, $numbers);
print_r($doubled); // [2, 4, 6, 8, 10]
// 过滤
$even = array_filter($numbers, fn($n) => $n % 2 === 0);
print_r($even); // [2, 4]
// 多维数组排序
$users = [
['name' => 'Alice', 'age' => 30],
['name' => 'Bob', 'age' => 25],
];
usort($users, fn($a, $b) => $a['age'] <=> $b['age']);
回调函数
// 排序 $items = ['apple', 'Banana', 'cherry']; usort($items, fn($a, $b) => strcasecmp($a, $b)); // 条件回调 $isAdult = fn($age) => $age >= 18; $ages = [15, 22, 18, 30]; $adults = array_filter($ages, $isAdult);
与闭包结合使用
function createMultiplier($factor) {
// 箭头函数自动继承 $factor
return fn($number) => $number * $factor;
}
$double = createMultiplier(2);
echo $double(5); // 10
$triple = createMultiplier(3);
echo $triple(5); // 15
注意事项
不能修改外部变量
$total = 0; $items = [10, 20, 30]; // ❌ 错误 array_map(fn($item) => $total += $item, $items); // ✅ 正确做法 $total = array_sum($items);
嵌套作用域
$outer = 10; $callback = fn() => fn() => $outer; // 两层都能访问 $outer $inner = $callback(); echo $inner(); // 10
与引用变量的区别
$value = 100;
// 箭头函数捕获的是当前值,不是引用
$arrow = fn() => $value;
$value = 200;
echo $arrow(); // 100(还是原来的值)
// 传统闭包可以通过引用捕获
$closure = function() use (&$value) {
return $value;
};
echo $closure(); // 200
性能建议
箭头函数比传统匿名函数稍微快一点(因为自动绑定作用域),但在大多数应用场景下差异可忽略,优先使用箭头函数来提高代码可读性:
// 不推荐(传统写法,比较啰嗦)
usort($users, function($a, $b) {
return $a['score'] <=> $b['score'];
});
// 推荐(箭头函数,简洁明了)
usort($users, fn($a, $b) => $a['score'] <=> $b['score']);
版本兼容性
- PHP 7.4+:支持箭头函数
- PHP 8.0+:支持从箭头函数内部调用
parent(类继承时) - PHP 8.1+:支持在箭头函数中使用
static
箭头函数最适合用于简单的、单表达式的回调,能把代码写得更简洁优美,对于复杂的多行逻辑,还是使用传统匿名函数或命名函数更合适。