PHP 8.2 已弃用字符串中 ${var} 和 ${(expr)} 写法,须改用 "$var" 或 "{$var}";常量/静态属性中禁止使用 [],必须用 array()。

PHP 8.2 中字符串内 ${var} 和 ${(expr)} 写法已被弃用,必须改用 "{$var}" 或直接 "$var";常量/静态属性等编译期上下文中禁止使用 [],必须写成 array()。
字符串插值中哪些大括号用法已失效
PHP 8.2 明确弃用了两种容易与可变变量混淆的语法:
-
"${foo}"—— 即使$foo是普通变量,这种写法也触发弃用警告 -
"${(foo)}"—— 实际是可变变量语法(${...}内支持表达式),但语义模糊,8.2 起禁用
这两种写法在 PHP 9 将彻底移除。运行时仍能执行,但会抛出 Deprecated: Using ${} in strings is deprecated。真实项目里只要 grep 出现 "\$\{ 就该处理。
推荐的字符串变量嵌入方式
只保留两种安全、明确、向前兼容的写法:
立即学习“PHP免费学习笔记(深入)”;
- 简单变量:直接用
"$var",最轻量,适合单个标量 - 复杂结构:统一用
"{$var}",支持数组索引("{$arr['key']}")、对象属性("{$obj->prop}")、方法调用("{$obj->method()}")甚至嵌套("{$items[0]->getName()}")
别再依赖 "${var}" 做“视觉强调”——它不提供额外能力,反而埋下升级风险。例如:$name = 'Alice'; echo "${name}"; 应改为 echo "{$name}"; 或更简洁的 echo "$name";。
const / static 属性里不能用 [] 的原因
这不是空数组本身的问题,而是 PHP 8.2 对「常量表达式」求值规则收紧所致:[] 被视为运行时语法糖,而 array() 才是编译期认可的字面量。
- 错误写法:
const DEFAULTS = [];→ 报Syntax error, unexpected '[' - 正确写法:
const DEFAULTS = array(); - 同理:
private static array $config = [];必须改成private static array $config = array();
注意:PHP 8.3 已放宽此限制,但若项目需兼容 8.2(比如企业环境尚未升级),array() 是唯一稳妥解。别被 IDE 自动补全误导——有些编辑器仍默认推 []。
容易被忽略的隐藏陷阱
改完语法后,还得检查三类边缘情况:
- 文件开头存在 BOM 或全角空格:会导致
const DATA = array();也被解析失败,用xxd -l 20 file.php查十六进制头 - 注释混入定义行:
const LIST = array(); // 空列表:说明中的中文冒号可能干扰解析(尤其旧版 Zend 引擎) - 模板引擎或 DSL 场景:Twig、Blade 等可能自行解析
${...},这类不属于 PHP 解析器管辖,但团队需统一对齐避免混淆
真正麻烦的不是改几行代码,而是 grep 出来上百处 "\$\{ 后,要逐个判断它到底是字符串插值还是误写的可变变量——后者可能藏在深层逻辑里,一改就坏。



















