在php8以前我们可能会写类似于下面的代码,通过switch
来做值的转换
switch ($input) {
case "true":
$result = 1;
break;
case "false":
$result = 0;
break;
case "null":
$result = NULL;
break;
}
在php8中新增了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开始将会得到语法错误了, 当然,方法名中还是可以用的。
参考RFC:Match Expression (最后一句:php yyds!!!)
如无特殊说明《php8新特性 - match表达式》为博主MoLeft原创,转载请注明原文链接为:https://moleft.cn/post-213.html