ZetCode

PHP fn 关键字

最后修改于 2025 年 4 月 16 日

PHP 的 fn 关键字引入了箭头函数,这是一种简洁的匿名函数语法。箭头函数会自动继承父作用域的变量。它们在 PHP 7.4 中被添加,作为传统闭包的一种更紧凑的替代方案。

基本定义

fn 关键字创建具有隐式变量绑定的箭头函数。与常规闭包不同,箭头函数会自动捕获包含作用域中的变量。这使得它们成为短回调函数的理想选择。

语法:fn(parameters) => expression。表达式的结果会自动返回。箭头函数不能包含语句或多个表达式。它们必须是单个表达式。

箭头函数在使用数组操作时特别有用,例如 array_maparray_filterarray_reduce。它们在使用回调时减少了样板代码。

基本的箭头函数

此示例演示了一个将数字加倍的简单箭头函数。

basic_fn.php
<?php

declare(strict_types=1);

$double = fn($x) => $x * 2;

echo $double(5); // Outputs 10

该代码定义了一个接受一个参数 $x 的箭头函数。它返回 $x * 2,而无需显式的 return 语句。该函数被赋值给 $double 变量。箭头函数可以像常规函数一样调用。

使用父作用域变量

此示例展示了箭头函数如何自动捕获父作用域。

scope_vars.php
<?php

declare(strict_types=1);

$factor = 3;

$multiply = fn($x) => $x * $factor;

echo $multiply(5); // Outputs 15

箭头函数使用父作用域中的 $factor,而无需显式导入它。与闭包不同,不需要 use 关键字。变量绑定是按值传递,而不是按引用传递。对 $factor 的更改不会影响绑定值。

使用箭头函数的数组映射

此示例演示了将箭头函数与 array_map 结合使用。

array_map.php
<?php

declare(strict_types=1);

$numbers = [1, 2, 3, 4];
$squared = array_map(fn($n) => $n ** 2, $numbers);

print_r($squared); // [1, 4, 9, 16]

该代码使用带有箭头函数的 array_map 对每个数组元素进行平方。简洁的语法消除了对单独函数定义的需要。箭头函数非常适合需要简单转换的数组操作。

多个参数

此示例显示了一个带有多个参数的箭头函数。

multiple_params.php
<?php

declare(strict_types=1);

$add = fn($a, $b) => $a + $b;

echo $add(3, 7); // Outputs 10

箭头函数接受两个参数并返回它们的总和。参数像常规函数一样用逗号分隔。可以使用类型提示和默认值来定义参数。=> 后面的表达式仍然必须是单个表达式。

过滤数组

此示例演示了如何使用箭头函数过滤数组。

array_filter.php
<?php

declare(strict_types=1);

$ages = [12, 18, 25, 15, 30];
$adults = array_filter($ages, fn($age) => $age >= 18);

print_r($adults); // [18, 25, 30]

该代码过滤数组以仅保留成年年龄。箭头函数为过滤提供了一个干净的内联条件。结果包括仅那些条件返回 true 的元素。箭头函数使数组操作更具可读性。

嵌套箭头函数

此示例展示了在其他箭头函数中使用箭头函数。

nested_functions.php
<?php

declare(strict_types=1);

$calculate = fn($x) => fn($y) => $x + $y;

$addFive = $calculate(5);
echo $addFive(3); // Outputs 8

外部箭头函数返回另一个箭头函数。这会创建一个将固定数字添加到其输入的函数。这种技术称为柯里化。每个箭头函数都会捕获其各自父作用域中的变量。

对象方法调用

此示例演示了如何从箭头函数调用对象方法。

object_method.php
<?php

declare(strict_types=1);

class Calculator {
    public function square($n) {
        return $n * $n;
    }
}

$calc = new Calculator();
$square = fn($x) => $calc->square($x);

echo $square(4); // Outputs 16

箭头函数在 $calc 对象上调用 square 方法。该对象是从父作用域自动捕获的。箭头函数可以与对象及其方法进行交互。它们在调用方法时会维护对象上下文。

最佳实践

来源

PHP 箭头函数文档

本教程涵盖了 PHP 箭头函数,并通过实际示例展示了 fn 关键字在各种场景下的用法。

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出 所有 PHP 教程