php 8的match语法运用
在PHP 8.0及之后的版本中,引入了match表达式,它是一种更简洁、更强大的条件判断结构,可视为switch语句的升级版。下面为你详细介绍它的语法、特性以及与switch的差异。
一、基础语法
$result = match (表达式) {
静态值1 => 返回值1, // ✅ 正确:左侧为静态值
静态值2, 静态值3 => 返回值2, // ✅ 多个静态值合并
表达式/函数调用 => 返回值4,
default => 默认返回值,
};关键点:
- 直接返回值:
match是表达式,而非语句,可直接赋值给变量。 - 严格比较:使用
===进行值的比较,需类型和值都一致。 - 无需
break:每个条件后无需中断,不会自动向下穿透。 - 支持表达式:匹配条件可以是变量、表达式或函数调用。
二、使用示例
1. 简单值匹配
$num = 2;
$result = match ($num) {
1 => '一',
2 => '二',
3 => '三',
default => '其他',
};
// $result = '二'2. 多条件合并
$day = 'Saturday';
$result = match ($day) {
'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday' => '工作日',
'Saturday', 'Sunday' => '周末',
default => '无效日期',
};
// $result = '周末'3. 表达式匹配
$age = 25;
$result = match (true) {
$age < 18 => '未成年人',
$age >= 18 && $age < 60 => '成年人',
default => '老年人',
};
// $result = '成年人'4. 函数返回值匹配
function getStatusCode() {
return 404;
}
$result = match (getStatusCode()) {
200 => '成功',
404 => '未找到',
500 => '服务器错误',
default => '其他错误',
};
// $result = '未找到'三、与switch的核心差异
| 特性 | match | switch |
|---|---|---|
| 比较方式 | 严格比较 (===) | 宽松比较 (==) |
| 是否返回值 | 是(表达式) | 否(语句) |
是否需要break | 否(不会穿透) | 是(默认穿透) |
| 支持表达式作为条件 | 是 | 否 |
| 示例 | $x = match (1) { 1 => 'a' }; | switch (1) { case 1: echo 'a'; } |
四、高级用法
1. 类型匹配(结合instanceof)
$obj = new DateTime();
$result = match (true) {
$obj instanceof DateTime => '日期对象',
is_array($obj) => '数组',
default => '其他类型',
};
// $result = '日期对象'2. 常量和字符串匹配
const APP_ENV = 'prod';
$result = match (APP_ENV) {
'dev' => '开发环境',
'test' => '测试环境',
'prod' => '生产环境',
default => '未知环境',
};
// $result = '生产环境'五、注意事项
match 比较分支值,使用了严格比较 (===), 而 switch 语句使用了松散比较。
match 表达式会返回一个值。
match 的分支不会像 switch 语句一样, 落空时执行下个 case。
match 表达式必须彻底列举所有情况。
必须覆盖所有可能的值:若未提供
default分支,且匹配失败,会抛出UnhandledMatchError异常。$x = 4; $result = match ($x) { // 缺少default,会报错 1 => '一', 2 => '二', };
六、兼容性
match表达式从PHP 8.0开始支持,若使用的是PHP 7.x及以下版本,需改用switch语句或其他替代方案。
总结
match表达式通过更简洁的语法、严格比较和直接返回值的特性,提升了代码的可读性和安全性,尤其适合复杂的条件判断场景。不过,在使用时要注意覆盖所有可能的情况,并了解它与switch的差异。
版权属于:Joyber
本文链接:https://blog.qqvbc.com/default/1313.html
转载时须注明出处及本声明