match表达式中空数组[]是合法返回值而非变量声明,可直接用于分支右侧,满足类型约束且语义清晰,如'log'=>[]或404=>[],不参与匹配比较,仅作为纯表达式结果。

PHP 8.0 的 match 表达式本身不支持“定义空数组”作为语法目标,它是一个**条件匹配并返回值的表达式**,不是变量声明或结构初始化工具。所谓“在 Match 中定义空数组”,实际是指:在某个分支的返回值中,直接写出 [](空数组字面量),且这种写法天然简洁、类型明确、无需额外处理。
空数组可直接作为分支返回值
match 每个分支右侧是任意表达式,[] 是合法的 PHP 表达式,因此可自然使用:
- 直接返回空数组:
$data = match($type) { 'user' => ['id' => 1], 'log' => [], default => null }; - 配合类型安全:若函数声明返回
array,用[]满足类型约束,比array()更现代、更轻量 - 无需包裹或赋值语句——
[]就是值,不是动作
避免常见误解:不是“在 match 里声明数组变量”
有人误以为要像 switch 那样在分支内执行 $arr = [];。这是不必要的:
-
match的设计目标是“求值并返回”,不是“执行语句” - 写
'user' => $arr = []属于副作用操作,破坏表达式纯度,也违背match的语义初衷 - 正确做法是让分支直接产出所需数据结构:
'user' => []或'post' => ['status' => 'ok']
结合实际场景的典型用法
空数组常用于表示“无数据”“默认配置”或“占位结构”,在 match 中可清晰传达意图:
立即学习“PHP免费学习笔记(深入)”;
- API 响应结构统一:
$response = match($code) { 200 => ['data' => $items], 404 => [], default => ['error' => 'unknown'] }; - 配置映射:
$options = match($env) { 'dev' => ['debug' => true], 'prod' => [], default => [] }; - 类型推断友好:PHP 8.1+ 的联合类型(如
array|false)中,[]明确属于array分支,IDE 和静态分析器能准确识别
注意 strict comparison 不影响空数组使用
因为 [] 是返回值,不参与左侧匹配比较,所以严格比较(===)机制对它完全无影响。你只需确保 subject(如 $type)的值能被正确匹配即可。例如:
-
match('config') { 'config' => [], 'log' => ['level' => 'info'] }✅ 完全合法 -
match("config") { 'config' => [] }❌ 字符串与字符串匹配成功,没问题;但若 subject 是整数0,则不会匹配到字符串'config',这正是 strict 所保障的安全性,和空数组无关



















