本文目录导读:

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 推荐的写法!
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播