PHP 7.4 引入了箭头函数,允许开发者编写简短的匿名函数。它为传统闭包提供了一种紧凑的替代方案,尤其是在函数体短小且功能集中的情况下。
本文将通过示例,学习如何在 PHP 中使用箭头函数。您还将了解箭头函数和匿名函数之间的区别。
先决条件
您应该了解如何编写基本的 PHP 代码(例如函数),并且能够使用数组。请确保您使用的是 PHP 7.4 或更高版本,因为箭头函数仅在该版本及更高版本中有效。
理解 PHP 中的箭头函数
PHP 箭头函数是一种简写语法。它定义了一个匿名函数,专为简单的操作和表达式而设计。
PHP 中的箭头函数最适合用于以下情况:
- 您需要一个快速回调或内联函数。
- 该函数返回单个表达式。
- 您想避免重复的
use
陈述。
箭头函数的基本语法是:
fn(parameter_list) => expression;
fn
是定义箭头函数的关键字。parameter_list
是参数列表(类似于普通函数)。=>
将参数列表与表达式分开。expression
是函数返回的值。此处不能使用语句块——只允许使用单个表达式。
箭头函数自动从作用域捕获变量。它们不需要use
关键字,如下所示:
$var_name = 10;
$func = function($n) use ( $var_name ) {
return $n * $var_name;
}
您可以直接使用范围内的变量:
$var_name = 10;
$func = fn($n) => $n * $var_name;
以下是语法作用域的示例:
$multiplier = 3;
$multiply = fn($x) => $x * $multiplier;
echo $multiply(4); // Outputs: 12
该变量$multiplier
会自动从外部作用域捕获。您无需use($multiplier)
像在传统匿名函数中那样使用。
箭头函数语法的关键规则:
- 总是使用
fn
,而不是function
。 - 没有花括号或
return
关键字——只有一个表达式。 - 从外部范围自动捕获变量。
- 它不能包含多个语句或控制结构(如
if
、foreach
等等)。
我们继续下面的章节来看看PHP中箭头函数和匿名函数的区别。
PHP 中箭头函数和匿名函数的区别
PHP 支持两种类型的匿名函数(即没有名称的函数):
- 传统的匿名函数
function
由关键字定义 - PHP 7.4 中引入了箭头函数,
fn
关键字为
这两种类型都可以赋值给变量,用于回调或作为函数参数。它们的用途相似,但在语法和处理外部变量的方式上有所不同。
让我们看看它们的主要区别。
1.语法
箭头函数:
箭头函数使用没有括号或语句的单行表达式return
。
$square = fn($n) => $n * $n;
箭头函数将其赋值给变量$square
。该函数接受一个参数$n
,并返回$n * $n
的平方$n
。
匿名函数:
$square = function($n) {
return $n * $n;
};
匿名函数使用完整的函数块,并且需要显式声明return
。它们用于多行逻辑或复杂行为。
2. 变量作用域(语法作用域)
箭头函数自动从外部作用域捕获变量:
$factor = 2;
$multiply = fn($x) => $x * $factor;
匿名函数要求您使用以下方式手动导入外部变量use
:
$factor = 2;
$multiply = function($x) use ($factor) {
return $x * $factor;
};
除非使用关键字,否则不能在匿名函数的范围内使用该变量use
。
3.可读性和简洁性
箭头函数更短。它们可以帮助你编写简短且单表达式的回调:
$numbers = [1, 2, 3];
$squares = array_map(fn($n) => $n * $n, $numbers);
但在以下情况下匿名函数更好:
- 函数体有多行。
- 您需要复杂的逻辑或控制结构。
下表显示了主要区别:
特征 | 箭头函数 | 匿名函数 |
引入于 | PHP 7.4 | PHP 5.3 |
句法 | 简短的单一表达 | 冗长、功能齐全的主体 |
范围处理 | 自动(词汇) | 手动 ( use ) 关键字 |
多行主体 | 不允许 | 允许 |
返回关键字 | 未使用 | 必需的 |
让我们继续下面的部分来了解如何从另一个函数返回箭头函数。
如何从其他函数返回箭头函数
函数是“一等公民”。这意味着你可以从另一个函数返回一个函数。这包括箭头函数。
您可以在常规函数中定义并返回箭头函数,如下所示:
function getMultiplier($factor) {
return fn($x) => $x * $factor;
}
$double = getMultiplier(2);
echo $double(5); // Outputs: 10
在此示例中:
getMultiplier()
返回一个箭头函数。- 箭头函数
$factor
自动从外部作用域捕获(词法作用域)。 - 返回的函数可以存储在变量中并像任何其他可调用函数一样使用。
它允许您根据参数生成小函数并减少代码重复。
当您需要构建动态行为(如自定义过滤器或函数工厂)时,请使用此语法。
让我们继续下面的部分,了解如何在代码中使用箭头函数。
如何在代码中使用箭头函数
使用箭头函数array_map()
array_map()
允许你为数组的每个元素设置回调。它允许你直接在函数调用中定义回调。
例子:
$numbers = [1, 2, 3, 4, 5];
$squares = array_map(fn($n) => $n * $n, $numbers);
print_r($squares);
// Outputs: [1, 4, 9, 16, 25]
fn($n) => $n * $n
对数组的每个元素执行箭头函数$numbers
。结果是一个新的平方值数组。
使用箭头函数array_filter()
array_filter()
在回调中过滤数组元素。箭头函数内联定义简短的过滤条件。
例子:
$numbers = [1, 2, 3, 4, 5, 6];
$evenNumbers = array_filter($numbers, fn($n) => $n % 2 === 0);
print_r($evenNumbers);
// Outputs: [2, 4, 6]
这里,箭头函数检查每个数字是否为偶数。结果是一个仅包含偶数的数组。
使用箭头函数array_reduce()
array_reduce()
基于回调函数将数组缩减为单个值。箭头函数有助于使代码更紧凑。
例子:
$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, fn($carry, $n) => $carry + $n, 0);
echo $sum; // Outputs: 15
箭头函数将数组中的每个数字相加。$carry
保存累计总数并且$n
是当前数字。
在 PHP 中嵌套箭头函数
这里内部函数执行一个操作,外部函数处理内部函数的结果。
$numbers = [1, 2, 3, 4, 5];
$doubleAndSquare = array_map(
fn($n) => fn($x) => ($x * 2) ** 2,
$numbers
);
$results = array_map(
fn($fn) => $fn(3),
$doubleAndSquare
);
print_r($results);
// Outputs: [36, 36, 36, 36, 36]
在上面的代码中,首先array_map()
创建一个箭头函数列表,该列表将数字加倍,然后平方。$numbers
数组中的每个元素都映射到一个嵌套的箭头函数。
第二个函数array_map()
将内部箭头函数(将值加倍并平方)应用于数字3
。结果是一个包含相同结果的数组。
总结
在本文中,您学习了箭头函数的基本特性和语法。它展示了它们相对于匿名函数的优势。
以下是一些关键要点:
- 箭头函数是在 PHP 7.4 中引入的。它提供了一种新的语法,可以用更简单的代码定义匿名函数。
- 箭头函数是编写匿名函数的一种更简洁的方式。它们只使用一行代码,并且不需要花括号或
return
关键字。 array_map()
箭头函数会自动从作用域中获取变量。这允许你在或 等函数中将箭头函数用作回调函数array_filter()
。