PHP 8 即将到来的 Switch 便捷写法 - Match 表达式

Laravel

Match Expression v2 RFC 已经通过,目标是稳定发布 PHP v8.0!RFC 仍然为未来的改进留有空间 (在 RFC 中注明),但是目前我们得到的单行表达式为匹配表达式提供了一种干净、简洁的语法。

由于 Match() {} 字符串是一个 expression (表达式),所以您可以通过赋值或者通过 return 来获取值,而不必赋值给局部变量:

// Before
switch ($this->lexer->lookahead['type']) {
    case Lexer::T_SELECT:
        $statement = $this->SelectStatement();
        break;

    case Lexer::T_UPDATE:
        $statement = $this->UpdateStatement();
        break;

    case Lexer::T_DELETE:
        $statement = $this->DeleteStatement();
        break;

    default:
        $this->syntaxError('SELECT, UPDATE or DELETE');
        break;
}

// After
$statement = match ($this->lexer->lookahead['type']) {
    Lexer::T_SELECT => $this->SelectStatement(),
    Lexer::T_UPDATE => $this->UpdateStatement(),
    Lexer::T_DELETE => $this->DeleteStatement(),
    default => $this->syntaxError('SELECT, UPDATE or DELETE'),
};

正如您在上面看到的,match (匹配) 这个表达式的意思是,当您的 switch 忘记了一个 break 时,并不会意外的失败。缺少条件 (且未提供默认值) 会导致匹配表达式抛出异常 UnhandledMatchError

match 还允许您使用逗号将多个匹配项合并为一个:

echo match ($x) {
    1, 2 => 'Same for 1 and 2',
    3, 4 => 'Same for 3 and 4',
};

酷,我什么时候可以开始使用 match?

PHP 8 GA (General Availability) 发布日期为 2020年11月26日,这意味着您可以在今年晚些时候开始使用匹配表达式!请务必查看 Match Expression v2 RFC 以了解有关此新语法特性的进一步详细信息。。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://laravel-news.com/match-expressio...

译文地址:https://learnku.com/laravel/t/47373

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 6

// Before
switch ($this->lexer->lookahead['type']) {
    case Lexer::T_SELECT:
        $statement = $this->SelectStatement();
       $statement = $this->SelectStatement2();
        break;

    case Lexer::T_UPDATE:
        $statement = $this->UpdateStatement(); $statement = $this->SelectStatement2();
        break;

    case Lexer::T_DELETE:
        $statement = $this->DeleteStatement(); $statement = $this->SelectStatement2();
        break;

    default:
        $this->syntaxError('SELECT, UPDATE or DELETE');
        break;
}

有多条语句的怎么做呢? 用逗号?分号分割?

4年前 评论
Littlesqx 4年前
kis龍 (作者) 4年前
JaguarJack

关注鸟哥的微信公众号吧,讲的比这个好

4年前 评论
october 4年前
何雨 4年前

工作中用了下,发现,这只能写一行的箭头函数,没啥鸟用,,,

4年前 评论

感觉语法越来越趋近于js,不知道是不是好事情

4年前 评论
雪风 4年前
墨风 4年前
october

鸟哥写的match的讲解,供参考,比这个说的好 www.laruence.com/2020/07/13/6033.h...

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!