PHP8 中引入了一个新的关键字:match,这个关键字的作用跟 switch 有点类似。
在以前我们可能会经常使用 switch 做值转换类的工作,类似:
$result = '';
switch ($input) {
case "true":
$result = 1;
break;
case "false":
$result = 0;
break;
case "null":
$result = NULL;
break;
}
那么如果使用 match 关键字呢,可以变成类似:
$result = match($input) {
"true" => 1,
"false" => 0,
"null" => NULL,
};
相比 switch, match 会直接返回值,可以直接赋值给 $result 了。
并且,类似switch的多个case一个block一样,match的多个条件也可以写在一起,比如:
$result = match($input) {
"true", "on" => 1,
"false", "off" => 0,
"null", "empty", "NaN" => NULL,
};
需要注意的和 switch 不太一样的是,以前我们用 switch 可能会经常遇到这种诡异的问题:
$input = "2 person";
switch ($input) {
case 2:
echo "bad";
break;
}
你会发现,bad 竟然被输出了,这是因为 switch 使用了宽松比较(==)。match 就不会有这个问题了, 它使用的是严格比较(===),就是值和类型都要完全相等。
还有就是,当 input 并不能被 match 中的所有条件满足的时候,match 会抛出一个UnhandledMatchError exception:
$input = "false";
$result = match($input) {
"true" => 1,
};
会得到:
Fatal error: Uncaught UnhandledMatchError: Unhandled match value of type string
这样就不用担心万一 match 条件没写全导致了不可预知的错误。
另外还是要说明,match 是关键字,也就是从 PHP8 开始它不能出现在 namespace 或者类名中,如果你的项目中有用 match 作为类名的:
class Match {}
在 PHP8 开始将会得到语法错误了, 当然,方法名中还是可以用的。
本文转载自风雪之隅博客:https://www.laruence.com/2020/07/13/6033.html
(adsbygoogle = window.adsbygoogle || []).push({});
来源:https://www.02405.com/archives/5668
