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关键字——只有一个表达式。
  • 从外部范围自动捕获变量。
  • 它不能包含多个语句或控制结构(如ifforeach等等)。

我们继续下面的章节来看看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。结果是一个包含相同结果的数组。

总结

在本文中,您学习了箭头函数的基本特性和语法。它展示了它们相对于匿名函数的优势。

以下是一些关键要点:

  1. 箭头函数是在 PHP 7.4 中引入的。它提供了一种新的语法,可以用更简单的代码定义匿名函数。
  2. 箭头函数是编写匿名函数的一种更简洁的方式。它们只使用一行代码,并且不需要花括号或return关键字。
  3. array_map()箭头函数会自动从作用域中获取变量。这允许你在或 等函数中将箭头函数用作回调函数array_filter()
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。