PHP 怎么PHP 箭头函数

wen PHP项目 3

本文目录导读:

PHP 怎么PHP 箭头函数

  1. 基本语法
  2. 核心特点
  3. 实际应用场景
  4. 注意事项
  5. 性能建议
  6. 版本兼容性

在 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

箭头函数最适合用于简单的、单表达式的回调,能把代码写得更简洁优美,对于复杂的多行逻辑,还是使用传统匿名函数或命名函数更合适。

抱歉,评论功能暂时关闭!