PHP8.0新功能之Match表达式的使用


Posted in PHP onJuly 19, 2020

上个月下旬PHP社区发布是PHP8第一个,正式版本也将于今年年底发布。PHP8带来来那个两个最令人激动的特性:JIT和match表达式。

PHP8.0新功能之Match表达式的使用

本文我们要说另一个新引入的语法match表达式语法,可以说是PHP 8引入的最好的功能之一,它使用类似switch的语法。

PHP8.0新功能之Match表达式的使用

基本功能

$status = match($request_method) { 
'post' => $this->handlePost(), 
'get', 'head' => $this->handleGet(), 
default => throw new \Exception('Unsupported'), 
};

用switch...case做对比,要实现上面的功能,代码要略繁琐一点:

switch ($request_method) { 
case 'post': 
$status = $this->handlePost(); 
break; 
case 'get': 
case 'head': 
$status = $this->handleGet(); 
break; 
default: 
throw new \Exception('Unsupported'); 
};

相比switch, match会直接返回值,无需中间变量(比如上例中的$status)。

表达式可以返回一个值

在每个分支可以被分配给一个变量。

$name = match(2) { 
1 => 'One', 
2 => 'Two', 
};

不必再将返回值分配给其他中变量,匹配的语句返回值可直接从match表达式中返回。

可匹配多个条件

match表达式可能包含一个或多个匹配条件,它们的行为类似于块中的多个级联case键switch。

match($request_method) { 
'post' => $this->handlePost(), 
'get', 'head' => $this->handleGet(), 
};

满足$request_method === 'get'和$request_method === 'head'两个条件都会执行$this->handleGet()。

每个分支只能包含一个表达式

与switch可以包含任意数量的表达式的块不同,一条match语句只能包含一个表达式。

match($name) { 
'XXX' => 
init(); 
doth(); 
};

上面的语法错误的。=>只能有一个表达式。

隐含的break

match表达式的每个匹配分支仅允许一个表达式,并且无需switch块一样的break。

switch ('test') { 
case 'test': 
$this->doTest (); 
case 'send': 
$this->sendmsg (); 
}

在switch...caser容易犯的错误是忘记了break语句,这会使流程直接进入下一分支。在上面的switch块中,缺少break;语句会使代码$this->doTest()无法正常执行执行。

match ('test') { 
'test' => $this->doTest (), 
'send' => $this->sendmsg (), 
};

match表达式无需显式break语句即可工作。它只执行一个match分支,并立即返回该值。

default分支

match语句支持一个default分支,该分支工作原理与switch...case块中的default情况类似。如果没有其他条件相匹配,将执行default match分支。

match ('DEF') { 
'aaa' => ..., 
'bbb' => ..., 
default => echo 'NO matching: ' . $name, 
}; 
 
// "NO matchin: DEFF"

match表达式必须符合条件

switch如果没有匹配case键,则block静默进行代码流。match表达式没有。

在match表达式中,必须存在与表达式匹配的条件或default要处理的条件。如果没有匹配项,而且为设置default分支,match表达式将会引发\UnhandledMatchError异常。

$value = 3; 
match($value) { 
1 => 'One', 
2 => 'Two', 
};

上面的代码执行时候会抛出错误:

Fatal error: Uncaught UnhandledMatchError in ... 

match\UnhandledMatchError如果表达式中没有匹配项,则表达式将引发异常。

\UnhandledMatchError是PHP 8中的新异常类,它扩展了\Error。有关所有PHP核心异常类的完整层次结构。

该类可以很容易地扩展:

class UnhandledMatchError extends \Error {}

对非强制类型的严格匹配

match表达式中最重要的设计选择之一是它对非强制类型的匹配。

function read(mixed $key): string { 
return match ($key) { 
1 => 'Integer 1', 
'1' => 'String 1', 
true => 'Bool true', 
[] => 'Empty array', 
[1] => 'Array [1]', 
}; 
} 
 
read(1); // "Integer 1" 
read('1'); // "String 1"

在典型的switch块中,其大小写是松散匹配的,即与==。在match表达式中,所有匹配的分支都经过严格的比较(===)匹配。

在上面的代码段中,每个单独的分支都将匹配其值和类型。

匹配任意表达式

match 表达式允许给定值与表达式匹配。

match($httpst){ 
404 => 'Page not found', 
Response::REDIRECT => 'Redirect', 
$client->getCode() => 'Client Error', 
$response->getCode() => 'Response Error', 
default => 'Unknown error' 
};

表达式将按照其排列顺序进行求值。

match表达式将尝试$httpst按以下顺序进行匹配:

1. $httpst === 404
2. $httpst === Response::REDIRECT
3. $httpst === $client->getCode()
4. $httpst === $response->getCode()
5. default

如果找到正匹配,则将不会对其他分支进行尝试,直接返回。

match VS switch

PHP8.0新功能之Match表达式的使用

向后兼容性影响

match表达式是PHP 8中的新语法。使用match表达式的代码在较旧的PHP版本中将不起作用。

到此这篇关于PHP8.0新功能之Match表达式的使用的文章就介绍到这了,更多相关PHP8.0 Match表达式内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
强烈推荐:php.ini中文版(2)
Oct 09 PHP
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
Mar 28 PHP
PHP 错误之引号中使用变量
May 04 PHP
PHP中英混合字符串截取函数代码
Jul 17 PHP
PHP面向对象学习笔记之二 生成对象的设计模式
Oct 06 PHP
解析CI的AJAX分页 另类实现方法
Jun 27 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
Jul 22 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
Mar 12 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
Jul 21 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
Apr 02 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
Jan 26 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 PHP
PHP程序守护进程化实现方法详解
Jul 16 #PHP
PHP如何获取Cookie并实现模拟登录
Jul 16 #PHP
PHP使用Http Post请求发送Json对象数据代码解析
Jul 16 #PHP
PHP字符串和十六进制如何实现互相转换
Jul 16 #PHP
PHP xpath提取网页数据内容代码解析
Jul 16 #PHP
浅析PHP中json_encode与json_decode的区别
Jul 15 #PHP
PHP vsprintf()函数格式化字符串操作原理解析
Jul 14 #PHP
You might like
新版PHP极大的增强功能和性能
2006/10/09 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
js修改input的type属性问题探讨
2013/10/12 Javascript
自己使用jquery写的一个无缝滚动的插件
2014/04/30 Javascript
手机端网页点击链接触发自动拨打或保存电话的示例代码
2014/08/15 Javascript
点击button获取text内容并改变样式的js实现
2014/09/09 Javascript
jQuery制作简洁的图片轮播效果
2015/04/03 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
2015/09/17 Javascript
JS实现仿微博可关闭弹出层效果
2015/09/21 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
2016/06/03 Javascript
require简单实现单页应用程序(SPA)
2016/07/12 Javascript
PHP实现本地图片上传和验证功能
2017/02/27 Javascript
Angular 2父子组件数据传递之@ViewChild获取子组件详解
2017/07/04 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
2018/05/02 Javascript
nodejs简单抓包工具使用详解
2019/08/23 NodeJs
layer弹出层倒计时关闭的实现方法
2019/09/27 Javascript
小程序简单两栏瀑布流效果的实现
2019/12/18 Javascript
[02:04]2016国际邀请赛中国区预选赛VG.R晋级之路
2016/07/01 DOTA
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
Python的socket模块源码中的一些实现要点分析
2016/06/06 Python
python中json格式数据输出的简单实现方法
2016/10/31 Python
Python利用QQ邮箱发送邮件的实现方法(分享)
2017/06/09 Python
python链接oracle数据库以及数据库的增删改查实例
2018/01/30 Python
Python安装与基本数据类型教程详解
2019/05/29 Python
怎么解决pycharm license Acti的方法
2020/10/28 Python
基于Django集成CAS实现流程详解
2020/11/28 Python
纯CSS3实现8组超炫酷鼠标滑过图片动画
2016/03/16 HTML / CSS
StubHub意大利:购买和出售全球演唱会和体育赛事门票
2017/11/21 全球购物
英国在线花园中心:You Garden
2018/06/03 全球购物
莫斯科制造商的廉价皮大衣:Fursk
2020/06/09 全球购物
应届生保险求职信
2013/11/11 职场文书
运动会广播稿30字
2014/01/21 职场文书
执行总经理岗位职责
2014/02/03 职场文书
《难忘的泼水节》教学反思
2014/02/27 职场文书
行政助理岗位职责范本
2015/04/11 职场文书
师范生见习总结范文
2015/06/23 职场文书