PHP 支持箭头函数语法吗?

问题描述 投票:0回答:4

在一遍又一遍地抱怨编写关键字

function
的麻烦任务后,我向某人询问了一种更简单的方法。该人士表示 PHP 将具有类似于 es6 的箭头函数语法。

const foo = (x, y) => {
    return x + y;
};

当我继续研究这个问题时,我在网上找不到很多例子。

有合适的人可以解释一下吗?

此时,我也对它如何适应 PHP 的 OOP 方面非常感兴趣。

php arrow-functions
4个回答
32
投票

2018年2月的原始答案:

这似乎是https://wiki.php.net/rfc/arrow_functions中描述的语法。它确实有一个实验性的实现。

在箭头函数提案中,提到它是“短闭包”提案的替代方案,https://wiki.php.net/rfc/short_closures

截至 2018 年 2 月,PHP 的当前版本为 7.1.4 / 7.2.2。

我找不到任何提案已获得批准的确认信息。前者处于“正在讨论”状态,后者处于“拒绝/撤回支持http://wiki.php.net/rfc/arrow_functions”。我认为现在判断 PHP 未来版本是否会采用它还为时过早。


2019 年 12 月更新:

该功能已在 PHP 7.4 中发布,根据 https://www.php.net/manual/en/migration74.new-features.php

箭头函数提供了一种用于定义函数的简写语法 隐式按值范围绑定。

<?php
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);

但是PHP手册页中有关匿名函数

的用法尚未更新

这是一篇详细介绍的博客:https://stitcher.io/blog/short-closures-in-php


12
投票

是的。 PHP 7.4 已接受新的 RFC https://wiki.php.net/rfc/arrow_functions_v2


6
投票

基于 PHP 7.4 的 RFC 代码可能如下

$users->map(
    fn($user) => $user->first_name.' '.$user->last_name
);

而不是

$users->map(function($user) {
    return $user->first_name.' '.$user->last_name;
});

0
投票

是的,好消息是 PHP 7.4 中引入了 php 箭头函数,它是 php 匿名函数的简洁语法,箭头函数和匿名函数都是闭包。

这就是箭头函数的基本形式

fn (argument_list) => expr.

所以

fn
现在是php的保留关键字。

这是 php 箭头函数的示例。

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

其输出是:10

但是 php 箭头函数只接受单个表达式。您不能在其中写入多个表达式。尽管您可以使用多行来编写单个表达。示例:

$ageCalculator = fn($brithYear) =>
  $brithYear
? 2024 - $brithYear
: null;

echo "Your are ". $ageCalculator(1991)." Years old.";

输出为:Your are 33 Years old.

注意:在上面的例子中你可以看到我在多行中写了一个express。但如果你尝试编写多个表达式,php 仍然不支持,就像 javascript 一样。

<script>
const ageCalculator = (year) => {
    const new_age = 2024 - year; 
    return new_age;
}
console.log("Your new age is " + ageCalculator(1991));
</script>

控制台输出为:Your new Age is 33

但是如果你想在php中编写多个表达式,你应该使用php匿名函数。示例:

$ageCalculator = function($brithYear){
    isset($brithYear) ?? null;
    if ($brithYear != null) {
        $age = 2024 - $brithYear;
    }
    return $age;
};
      

echo "Your are ". $ageCalculator(1991)." Years old.";

输出为:Your are 33 Years old.

© www.soinside.com 2019 - 2024. All rights reserved.