PHP 7.4 起弃用 $arr{0} 和 $str{1} 等大括号访问数组/字符串偏移的语法,必须替换为 [];该弃用仅针对变量后紧跟的偏移操作符 {},与控制结构花括号无关。

PHP 7.4 中 {} 访问数组/字符串偏移被弃用
PHP 7.4 开始,$arr{0} 和 $str{1} 这类用大括号访问数组或字符串单个元素的写法,会触发 Array and string offset access syntax with curly braces is deprecated 警告,并在 PHP 8.0+ 彻底报错。这不是风格问题,而是语法层移除——底层解析器已不再识别该语法结构。
所有 {} 偏移必须替换成 []
替换非常直接,但需注意边界场景:
-
$value{0}→$value[0](字符串首字符) -
$arr{$key}→$arr[$key](动态键名,$key是变量) -
$str{strlen($str)-1}→$str[strlen($str)-1](末尾字符,下标计算不变) - 多维访问如
$data{0}{1}→$data[0][1],逐层替换即可
不需要改逻辑,只改符号。但要注意:如果 $value 是 null 或非数组/字符串类型,$value[0] 在 PHP 7.4+ 会静默返回 null(而旧版可能报 notice),建议配合 isset() 或类型判断使用。
别把控制结构的 {} 和偏移 {} 混为一谈
这个警告**只针对变量后紧跟的 {} 偏移语法**,和 if/for/while 的花括号完全无关。以下写法依然合法且推荐:
if ($cond) {
echo 'ok';
}
而以下才是要改的:
// ❌ 已弃用
echo $str{0};
// ✅ 正确
echo $str[0];
混淆点在于:错误信息里写的 “curly braces” 容易让人联想到所有大括号,其实它特指「作为访问操作符的大括号」,不是语法块定界符。
批量替换时容易漏掉的角落
手动搜索 { 很容易误伤,建议用正则精准定位(例如 VS Code 中):
- 匹配字符串偏移:
(\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\{(\d+)\} - 匹配带变量键:
(\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\{(\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}
特别注意第三方库(比如 ThinkPHP 的 Query.php)中隐藏的 $value{0},这类代码不会出现在你自己的业务文件里,但运行时报错源头难定位。升级前务必检查所用框架/组件是否已适配 PHP 7.4+。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











