千家信息网

PHP8.0之Match表达式的示例分析

发表于:2024-10-22 作者:千家信息网编辑
千家信息网最后更新 2024年10月22日,小编给大家分享一下PHP8.0之Match表达式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!本文我们要说另一个
千家信息网最后更新 2024年10月22日PHP8.0之Match表达式的示例分析

小编给大家分享一下PHP8.0之Match表达式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

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

基本功能

$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

向后兼容性影响

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

以上是"PHP8.0之Match表达式的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

表达式 分支 条件 代码 语句 语法 面的 功能 变量 多个 篇文章 类型 错误 示例 分析 内容 顺序 分配 尝试 工作 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 专升本数据库和编程哪个难 建立和维护数据库体会 大学生联合论文数据库 浙江通信软件开发过程检测中心 服务器多页面登录不了怎么办 天津智慧餐厅系统软件开发定制 汇编指令连接数据库 数据库应用总结报告 网络安全手抄报小学生 一等奖 财务系统显示未连接到数据库 软件开发项目算实体吗 仙珍园 代理服务器 廊坊固安cmmi软件开发 存储主机和管理服务器的区别 网络安全藏语版 中学安全检查网络安全 什么是服务器开发 网络技术报考网站 达梦数据库的版本和授权怎么查看 淮北软件开发哪家好 网络安全总结小学 嵌入式软件开发区烤肉拍照 广州智能消防软件开发报价 软件开发跟测试 东莞市三心软件开发公司 天龙互联网科技有限公司招聘 苹果共享文件夹服务器出现问题 高自由度手机服务器游戏 软件开发个人简历范文 普陀区网络技术服务产业
0