箭头函数是 PHP 7.4 的新语法,是一种更简洁的匿名函数写法。

箭头函数的基本语法为 fn (argument_list) => expr

示例 #1 箭头函数自动捕捉变量的值

<?php

$y = 2;
//箭头函数写法
$fn1 = fn($x) => $x + $y;

//匿名函数写法
$fn2 = function ($x) use ($y) {
    return $x + $y;
};
var_export($fn1(3));
?>

在上面的示例中,$fn1 与 $fn2 写法不同但是意义完全相同,其中箭头函数不需要 use 可以自动捕捉变量的值,箭头函数在嵌套情况下仍然有效,参见示例2。

示例 #2 箭头函数嵌套自动捕捉变量的值

<?php

$z = 1;
$fn = fn($x) => fn($y) => $x * $y + $z;

var_export($fn(5)(10));
?>

以上示例最终会输出 51。

因为箭头函数是匿名函数的简单写法,因此和匿名函数一样,箭头函数语法同样允许标准的函数声明,包括参数和返回类型、缺省值、变量,以及通过引用传递和返回。以下都是箭头函数的有效例子。

示例 #3 合法的箭头函数例子

<?php

fn(array $x) => $x;
static fn(): int => $x;
fn($x = 42) => $x;
fn(&$x) => $x;
fn&($x) => $x;
fn($x, ...$rest) => $rest;

?>

以上全部是合法的箭头函数。

箭头函数会自动绑定上下文变量,这相当于对箭头函数内部使用的每一个变量 $x 执行了一个 use($x)。这意味着不可能修改外部作用域的任何值,若要实现对值的修改,应该使用匿名函数来替代。

示例 #4 来自外部范围的值不能在箭头函数内修改,而匿名函数可以通过引用传递实现

<?php

$x = 1;

$fn1 = fn() => $x++; // 不会影响 x 的值
$fn1();
var_export($x);  // 输出 1

$fn2 = function() use(&$x){
    $x++;
};//引用传递,会改变 x 的值
var_export($x);  // 输出 2
?>