PHP 7.0 要求所有控制结构必须用花括号包裹且格式规范,动态属性、方法调用及字符串变量插值也须用{}显式分组以防解析错误。

PHP 7.0 中大括号 {} 的写法,核心就一条:所有控制结构必须用花括号,且位置和缩进有固定规则,不能靠“省略”来图省事。
if/elseif/else 必须用 { } 包裹,且换行缩进要对齐
即使只有一条语句,也必须写 {}。省略会导致后续加逻辑时出错,而且 PHP 7.0+ 的 PSR-12 规范明确要求结构体主体必须被成对花括号包裹。
常见错误现象:if ($user) echo "Hi"; echo "Bye"; —— 第二个 echo 总会执行,和 $user 无关。
正确写法要点:
-
if后的左括号(紧贴关键词,右括号)和左花括号{之间必须有一个空格 -
{不换行,}单独成行,且与if对齐 -
elseif是一个单词,不能写成else if(尤其在冒号语法中会直接报解析错误) - 多分支条件要互斥、顺序合理,比如先
$score >= 90,再80,避免漏判
动态属性/变量名必须用 {} 显式分组
PHP 7.0 改变了间接变量解析顺序,$obj->$prop['key'] 被解释为 ($obj->$prop)['key'],而不是你想要的 $obj->{$prop['key']}。不加 {} 就会访问错属性。
典型场景:
- 用数组值当属性名:
$obj->{$config['field']}✅,不是$obj->$config['field']❌ - 调用动态方法:
$obj->{$method}()✅,不是$obj->$method()❌ - 静态调用动态常量:
Foo::{$name}()✅,不是Foo::$name()❌ - 全局变量引用:
global ${$foo->bar};✅,不是global $$foo->bar;❌
字符串内插变量也要用 {} 防歧义
当变量是数组或对象属性时,不加 {} 会导致解析失败或取错值。比如 "$arr[key]" 实际被当作字面量 key,而非 $arr['key']。
安全写法:
- 数组元素:
"{$arr['key']}"或"{$arr[$k]}" - 对象属性:
"{$obj->name}"、"{$obj->{$prop}}" - 避免
"$obj->name"这种写法——它只在简单属性名下侥幸工作,一遇到$obj->user_name或带表达式的就挂
switch/case 和循环结构的 {} 不能省,且缩进层级要清晰
switch 的 {} 必须换行独立,case 本身不带 {},但每个 case 块里的语句必须统一缩进一次,break 也要缩进对齐。
容易踩的坑:
-
case后直接写多行代码却不加{}—— 语法虽允许,但可读性差,且一旦加if就容易漏缩进 -
while或foreach只有一行时省略{},结果后来加日志语句变成无条件执行 -
for循环体没缩进,和上层if混在一起,审查时一眼看不出归属
最稳妥的做法:不管单行多行,所有控制结构都写 {},缩进统一用 4 空格,} 单独成行对齐上层关键词。这不是教条,是防止你在改别人代码或凌晨三点修 bug 时,把 break 写到 case 外面还浑然不觉。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











