PHP fn 关键字
最后修改于 2025 年 4 月 16 日
PHP 的 fn
关键字引入了箭头函数,这是一种简洁的匿名函数语法。箭头函数会自动继承父作用域的变量。它们在 PHP 7.4 中被添加,作为传统闭包的一种更紧凑的替代方案。
基本定义
fn
关键字创建具有隐式变量绑定的箭头函数。与常规闭包不同,箭头函数会自动捕获包含作用域中的变量。这使得它们成为短回调函数的理想选择。
语法:fn(parameters) => expression
。表达式的结果会自动返回。箭头函数不能包含语句或多个表达式。它们必须是单个表达式。
箭头函数在使用数组操作时特别有用,例如 array_map
、array_filter
和 array_reduce
。它们在使用回调时减少了样板代码。
基本的箭头函数
此示例演示了一个将数字加倍的简单箭头函数。
<?php declare(strict_types=1); $double = fn($x) => $x * 2; echo $double(5); // Outputs 10
该代码定义了一个接受一个参数 $x
的箭头函数。它返回 $x * 2
,而无需显式的 return 语句。该函数被赋值给 $double
变量。箭头函数可以像常规函数一样调用。
使用父作用域变量
此示例展示了箭头函数如何自动捕获父作用域。
<?php declare(strict_types=1); $factor = 3; $multiply = fn($x) => $x * $factor; echo $multiply(5); // Outputs 15
箭头函数使用父作用域中的 $factor
,而无需显式导入它。与闭包不同,不需要 use
关键字。变量绑定是按值传递,而不是按引用传递。对 $factor
的更改不会影响绑定值。
使用箭头函数的数组映射
此示例演示了将箭头函数与 array_map
结合使用。
<?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
对每个数组元素进行平方。简洁的语法消除了对单独函数定义的需要。箭头函数非常适合需要简单转换的数组操作。
多个参数
此示例显示了一个带有多个参数的箭头函数。
<?php declare(strict_types=1); $add = fn($a, $b) => $a + $b; echo $add(3, 7); // Outputs 10
箭头函数接受两个参数并返回它们的总和。参数像常规函数一样用逗号分隔。可以使用类型提示和默认值来定义参数。=>
后面的表达式仍然必须是单个表达式。
过滤数组
此示例演示了如何使用箭头函数过滤数组。
<?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 的元素。箭头函数使数组操作更具可读性。
嵌套箭头函数
此示例展示了在其他箭头函数中使用箭头函数。
<?php declare(strict_types=1); $calculate = fn($x) => fn($y) => $x + $y; $addFive = $calculate(5); echo $addFive(3); // Outputs 8
外部箭头函数返回另一个箭头函数。这会创建一个将固定数字添加到其输入的函数。这种技术称为柯里化。每个箭头函数都会捕获其各自父作用域中的变量。
对象方法调用
此示例演示了如何从箭头函数调用对象方法。
<?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
方法。该对象是从父作用域自动捕获的。箭头函数可以与对象及其方法进行交互。它们在调用方法时会维护对象上下文。
最佳实践
- 简洁性: 对简短、简单的操作使用箭头函数。
- 可读性: 避免在箭头函数中使用复杂的表达式。
- 作用域: 请记住它们按值捕获变量,而不是按引用捕获。
- 限制: 不要将它们用于多语句函数。
- 数组操作: 优先与 array_map、filter、reduce 一起使用。
来源
本教程涵盖了 PHP 箭头函数,并通过实际示例展示了 fn
关键字在各种场景下的用法。
作者
列出 所有 PHP 教程。