PHP 8.0 彻底移除 $str{0} 语法,因花括号语义混乱且自 PHP 5.4 起 [] 已统一支持字符串偏移,改用 $str[0] 并建议配合 is_string() 类型检查。

PHP 8.0 禁用了用花括号 {} 读取字符串单个字符的语法,必须改用方括号 [],否则直接报 Fatal error: Uncaught Error: Cannot use string offset as an array 或类似解析错误。
为什么 PHP 8.0 不让用 $str{0} 了
PHP 7.4 已经把 $str{0} 标记为废弃(deprecated),PHP 8.0 彻底移除。这不是兼容性警告,是硬性语法变更——引擎不再识别这种写法,连 parse 阶段都会失败。
根本原因是:花括号在 PHP 中长期用于变量解析(如 "{$arr['key']}")和可变变量(${'var'}),语义混乱;而 [] 从 PHP 5.4 起就明确支持字符串偏移访问,更统一、更安全。
常见出错场景包括:
立即学习“PHP免费学习笔记(深入)”;
- 旧代码里遍历字符串:
for ($i = 0; $i - 取首字符:
$first = $str{0}; - 正则替换后取某位:
$match[0]{2}($match[0]是字符串)
所有 {} 字符访问必须替换成 []
替换规则极其简单:把 { 换成 [,} 换成 ],其余不变。
示例对比:
// PHP 7.4 可用(但已警告),PHP 8.0 报错
echo $str{0};
echo $str{$pos};
echo $data['key']{2};
// PHP 8.0 唯一合法写法
echo $str[0];
echo $str[$pos];
echo $data['key'][2];
注意:
- 空字符串或越界索引(如
$str[10]当strlen($str) === 3)在 PHP 8.0 中返回null(不是 Notice),行为和 PHP 7 一致 - 不能混用:写成
$str{0}[1]或$str[0]{1}都非法,PHP 8.0 解析不过 - 如果原代码用的是动态键名如
$str{"$i"},要改成$str[(int)$i],避免字符串键被误当作数组下标
批量替换时容易漏掉的边界情况
全局搜索 { 很危险,因为花括号还出现在数组字面量、匿名函数、HEREDOC 结构里。只匹配「紧邻变量名+左花括号+数字/变量+右花括号」模式才安全。
推荐 grep + 手动确认(Linux/macOS):
grep -n '\$\w\+{\w*}' *.php
重点关注这些位置:
- 函数参数内:
substr($str{0}, 1)→ 改成substr($str[0], 1) - 三元表达式:
$cond ? $s{0} : 'x'→$cond ? $s[0] : 'x' - 类属性访问链:
$obj->str{0}→$obj->str[0](前提是$obj->str是字符串) - 数组+字符串混合:
$arr[0]{1}→$arr[0][1],但得先确认$arr[0]确实是字符串而非数组
最麻烦的其实是嵌套结构里隐含的字符串访问,比如 $data[$key]{0} —— 这种必须确保 $data[$key] 的类型是 string,否则 [] 会触发“trying to access array offset on value of type int”之类新错误。PHP 8.0 对类型更严格,别只改语法,顺手加个 is_string() 判断更稳妥。



















