PHP8alpha2发布,最近引入了一个新的关键字:match,这个关键字的作用有点类似于switch。虽然我一般对语法糖没什么感觉,但是我觉得这个有点意思。match这个词也很漂亮,那么它有什么作用呢?以前我们可能经常用switch做值转换的工作,类似:switch($input){case"true":$result=1;休息;案例“假”:$result=0;休息;案例“空”:$result=NULL;break;}(当然有同学会说,谁会这么写,用数组转换不行吗?拜托,这是个例子,数组只能是数字键和整数,万一键需要其他表达式,如果你希望多个键对应一个值,对吧?)然后如果你使用match关键字,它可以变成这样:$result=match($input){"true"=>1,"false"=>0,"null"=>NULL,};与switch相比,match会直接返回值,可以直接赋值给$result。而且,像switch的多case一块,match的多个条件也可以写在一起,例如:$result=match($input){"true","on"=>1,"false","off"=>0,"null","empty","NaN"=>NULL,};需要注意的是它和switch不一样,我们在使用switch的时候可能经常会遇到这种奇怪的问题:$input="2person";switch($input){案例2:echo"bad";break;}你会发现输出的是bad,因为switch使用的是松散比较(==)。match不会有这个问题,它使用的是严格比较(===),即值和类型必须完全相等。此外,当匹配中的所有条件都不能满足输入时,匹配将抛出UnhandledMatchError$input="false";$result=match($input){"true"=>1,};willGet:Fatalerror:UncaughtUnhandledMatchError:Unhandledmatchvalueoftypestring这样就不用担心匹配条件写不全会出现不可预知的错误了。另外需要说明的是,match是关键字,即不能出现在PHP8开始的命名空间或类名中。如果你在项目中使用match作为类名:classMatch{},你就不用担心匹配条件了。写入所有导致不可预知的错误。另外需要说明的是,match是关键字,即不能出现在PHP8开始的命名空间或类名中。如果在项目中使用match作为类名:classMatch{}从PHP8开始会报语法错误,当然方法名中仍然可以使用。详情请参考RFC:上面的MatchExpression,不再赘述。
