match 是 php 8.0+ 的表达式语法,必须写为 match (subject) { ... },subject 必须是可求值表达式,分支 pattern 仅支持字面量/常量/枚举成员且用 === 比较,匹配布尔逻辑需用 match (true),default 分支强制存在。

match 不是函数,不能“调用”,它是 PHP 8.0 的表达式语法,必须以 match (subject) { ... } 形式直接书写,不能加括号调用、不能赋值给变量后再执行。
match 必须带 subject,且 subject 是一个表达式
你不能写 match { ... } 或 match() { ... } —— 这会直接报 Parse error: syntax error。
subject 可以是:
- 变量:
$method - 函数返回值:
gettype($value) - 计算结果:
$status % 100 - 常量或字面量:
'GET'、200
常见错误:把 subject 写成语句(如 echo $x)或空值;match 要求 subject 必须可求值,否则解析失败。
分支条件只能是字面量、常量、枚举成员,不能是变量或函数调用
下面这些写法都非法:
-
$a, $b => 'x'(变量不允许) -
strtolower($s) => 'y'(函数调用不允许出现在左侧) -
[1, 2] => 'z'(数组不是合法 pattern)
合法 pattern 示例:
'get', 'head' => 'read'-
HTTP_STATUS_OK, HTTP_STATUS_CREATED => 'success'(常量) -
Status::Active, Status::Pending => 'live'(PHP 8.1+ 枚举成员)
注意:所有 pattern 都参与 === 比较,'200' ≠ 200,类型错一点就跳过该分支。
true 作 subject 是处理动态条件的唯一正解
当你要匹配范围、布尔结果或复合判断(比如 $age >= 18),必须用 match (true),让每个分支左边是布尔表达式:
$level = match (true) {
$score >= 90 => 'A',
$score >= 80 => 'B',
$score >= 70 => 'C',
default => 'F',
};
关键点:
- 分支按顺序从上到下执行,第一个为
true的分支立即返回,后续不看 - 必须从窄到宽写(如先
$score >= 90,再$score >= 80),否则宽条件会截断 -
default不可省略,哪怕你认为输入已全覆盖 —— 缺少它运行时必抛UnhandledMatchError
default 不是可选项,是强制兜底机制
哪怕你枚举了全部 HTTP 状态码,只要没写 default,PHP 就不认为逻辑穷尽。例如:
$msg = match ($code) {
200 => 'OK',
404 => 'Not Found',
500 => 'Server Error',
}; // ❌ 运行时报错:UnhandledMatchError
正确写法必须显式包含 default:
$msg = match ($code) {
200 => 'OK',
404 => 'Not Found',
500 => 'Server Error',
default => 'Unknown',
}; // ✅
容易被忽略的是:null、false、0.0、'200'、未定义常量等,都会落到 default;别指望靠类型声明或文档约束输入,match 的穷尽性检查只看语法结构,不看运行时类型。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











