PHP 8.0 未引入任何“大括号新语法”,所谓相关写法实为 match 表达式(花括号为固定容器)和注解(#[...] 为方括号+圆括号组合)两个独立特性,二者均不改变大括号原有语义。

PHP 8.0 没有引入任何与「大括号写法」相关的新语法特性。所谓“大括号写法”在 PHP 中通常指变量解析(如 "{$var}")、数组字面量(['a', 'b'])、对象属性访问($obj->{$prop})或匿名类定义(new class { ... })等场景,但这些在 PHP 8.0 中均未改动语法结构本身。
真正容易被误认为是“大括号新写法”的,其实是以下两个独立特性——它们常出现在花括号包围的上下文中,但本质与大括号无关:
match 表达式用花括号包裹,但不是新大括号语法规则
match 的语法确实用花括号组织分支,但它属于全新控制结构,而非对大括号含义的扩展:
它要求每个分支必须是单表达式,且自动返回值;分支键使用严格比较(===),不支持 fall-through;花括号只是其固定语法容器,和数组/对象的大括号无继承关系。
常见错误:把 match 当成增强版 switch 直接套用旧逻辑,结果因严格比较或缺少 default 导致 UnhandledMatchError:
立即学习“PHP免费学习笔记(深入)”;
-
match(8.0) { '8.0' => 'string', 8.0 => 'float' }→ 返回'float'(正确) -
match('8') { 8 => 'int' }→ 抛出UnhandledMatchError(无匹配且无default)
注解(Attributes)使用 #[...] 语法,不是大括号,但视觉上易混淆
#[Route("/api", methods: ["GET"])] 看似带花括号,实为方括号 + 圆括号组合。这是 PHP 8.0 引入的原生注解语法,完全替代了 PHPDoc 风格的 /** @Route(...) */。
关键点:
- 必须用
#[]开头,内部参数用圆括号,键名后跟冒号,数组用方括号 —— 这三类括号各司其职,不可混用 - 不能动态构造,如
#[${$attr}]或#[SomeAttribute(...$args)]均非法 - 若在类方法上同时写 PHPDoc 和
#[...],两者共存但互不干扰;框架读取逻辑需明确适配新语法
构造函数属性提升中花括号内出现 public/private,不是新大括号功能
像public function __construct(public string $name, private int $age) 这种写法,花括号只是构造函数参数列表的常规容器。真正的变化是参数前加访问修饰符会自动声明并初始化同名属性。
容易踩的坑:
- 提升的参数类型不能是
callable,否则解析失败 - 混合提升与非提升参数时,顺序随意,但命名参数调用时仍需遵守位置约束(命名参数必须在所有位置参数之后)
- 如果构造函数体中有额外逻辑,属性赋值发生在执行函数体之前 —— 这点和 PHP 7.x 手动赋值行为一致,但初学者易误以为“先执行构造函数再赋值”
真正影响括号使用的细节,藏在联合类型和命名参数里:联合类型用 | 分隔(如 int|string),命名参数调用时用冒号(double_encode: false),它们都避开了对花括号的依赖。PHP 8.0 的演进方向是让括号回归本职——分组、调用、字面量,而不是承载语义。



















