本文目录导读:

PHP 的匹配表达式(Match Expression)是 PHP 8.0 引入的一项新特性,类似于 switch 语句但更简洁和安全,我来详细讲解一下:
基本语法
$result = match ($expression) {
condition1 => value1,
condition2 => value2,
default => value_default,
};
简单示例
$status = 200;
$message = match ($status) {
200 => 'OK',
404 => 'Not Found',
500 => 'Server Error',
default => 'Unknown Status',
};
echo $message; // 输出: OK
多条件匹配(用逗号分隔)
$grade = 'B';
$remark = match ($grade) {
'A', 'B' => 'Excellent',
'C', 'D' => 'Pass',
'F' => 'Fail',
default => 'Invalid Grade',
};
echo $remark; // 输出: Excellent
条件表达式
$score = 85;
$result = match (true) {
$score >= 90 => 'A',
$score >= 80 => 'B',
$score >= 70 => 'C',
$score >= 60 => 'D',
default => 'F',
};
echo $result; // 输出: B
严格比较
match 使用严格比较(),而 switch 使用松散比较():
$value = "1"; // 字符串
$result = match ($value) {
1 => 'integer one',
"1" => 'string one',
default => 'other',
};
// 输出: string one
// 如果用 switch
switch ($value) {
case 1:
echo 'integer one'; // 会匹配这个
break;
}
无 default 时的异常
如果不匹配任何条件且没有 default,会抛出 UnhandledMatchError:
$value = 10;
try {
$result = match ($value) {
1 => 'one',
2 => 'two',
};
} catch (UnhandledMatchError $e) {
echo '未匹配到任何值';
}
实际应用示例
路由处理
$route = '/users';
$controller = match ($route) {
'/home' => 'HomeController',
'/users' => 'UserController',
'/admin' => 'AdminController',
default => 'PageNotFoundController',
};
类型判断
function getTypeLabel(mixed $data): string {
return match (true) {
is_string($data) => '字符串',
is_int($data) => '整数',
is_float($data) => '浮点数',
is_bool($data) => '布尔值',
is_null($data) => 'NULL',
is_array($data) => '数组',
is_object($data) => '对象',
default => '未知类型',
};
}
echo getTypeLabel([1,2,3]); // 数组
月份天数
function daysInMonth(int $month): int {
return match($month) {
2 => 28,
4, 6, 9, 11 => 30,
1, 3, 5, 7, 8, 10, 12 => 31,
default => throw new InvalidArgumentException('无效月份'),
};
}
Match vs Switch 对比表
| 特性 | Switch | Match |
|---|---|---|
| 比较方式 | 松散比较 (==) | 严格比较 (===) |
| 返回值 | 需要 break | 自动返回 |
| 表达式结果 | 无返回值 | 有返回值 |
| 简写语法 | 不支持 | 支持箭头 => |
| 无匹配时 | 继续执行 | 抛异常(无default时) |
| 多条件 | 需要多个case | 逗号分隔即可 |
最佳实践
- 优先使用 match:当需要返回值时,match 更简洁
- 始终添加 default:避免未预期的错误
- 利用严格比较:避免类型转换带来的问题
- 适用于常量比较:不适合复杂逻辑判断
// 正确用法
$category = match($type) {
'a' => 'Category A',
'b' => 'Category B',
default => 'Uncategorized',
};
// 避免复杂逻辑
// 复杂逻辑应该用 if-elseif-else
if ($x > 10 && $y < 20) {
// 复杂条件判断
} elseif ($x === 5 && $y === 6) {
// 另一种情况
}
Match 表达式让代码更简洁、可读性更好,是现代 PHP 推荐的写法!