php 8 的 match 表达式是语义更清晰、类型更安全的 switch 替代方案,强制返回值、严格比较、自动终止、必须覆盖所有路径;支持单值/多值匹配、match(true) 条件判断、嵌套及枚举输入。

PHP 8 的 match 表达式不是 switch 的简化写法,而是语义更清晰、类型更安全的替代方案。它强制返回值、使用严格比较(===)、自动终止匹配、必须处理所有可能路径(含 default),适合做纯映射类逻辑。
基础写法:直接赋值,告别 break
match 是表达式,能直接参与赋值或函数调用,不需要额外 return 或 break:
- 单值匹配:
$result = match($status) { 200 => 'OK', 404 => 'Not Found', default => 'Unknown' }; - 多值共用同一结果:用逗号分隔,如
'pending', 'reviewing' => 'in_progress' - 分支右侧只能是单个表达式,不能写多条语句(比如不能在 => 后面跟 echo 或 $a++)
类型安全:严格比较(===)是默认行为
字符串 "200" 和整数 200 不相等,不会自动转换。这是优势,也是常见报错根源:
- 从数据库或 API 接收的状态码常为字符串,但分支写了
200 => ...→ 触发UnhandledMatchError - 调试建议:先
var_dump(gettype($input), $input)确认类型 - 稳妥做法:显式统一类型,例如
(int)$input,或分支同时支持两种写法:"200", 200 => 'OK'
进阶用法:用 match(true) 模拟 if-else 链
当需要范围判断或动态条件时,把 true 作为主体,分支写布尔表达式:
$level = match(true) { $score >= 90 => 'A', $score >= 80 => 'B', default => 'C' };- 支持函数调用:
match(gettype($data)) { 'string' => strtoupper($data), 'array' => implode(',', $data), default => null } - 可嵌套使用:
match($env) { 'prod' => match($mode) { 'fast' => 'cache_on', default => 'cache_off' }, default => 'debug_mode' }
必须写 default 分支
没有 default 且输入值未被任何分支匹配,会立即抛出 UnhandledMatchError —— 这是运行时致命错误,不是警告:
- 即使你认为“不可能进来”,也应写
default => throw new InvalidArgumentException("Unexpected value: $input") - 不推荐用
default => null消极兜底,容易掩盖类型或逻辑问题 - 枚举(enum)是最理想的输入源,天然类型固定、IDE 可补全、静态分析可校验
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











