PHP中if/else需强制花括号防逻辑错误,switch须每case加break防穿透,foreach慎用引用避免修改原数组,while循环须确保变量更新防死循环。

if/else 语句里别漏掉括号和分号
PHP 的 if 不像 JavaScript 那样能省略花括号,漏掉 {} 会导致只有第一行受控制,后续代码无条件执行。常见错误是写成:
if ($user_id > 0)
echo "登录了";
$role = get_role($user_id); // 这行永远执行!
正确写法必须加花括号,哪怕只有一行:
if ($user_id > 0) {
echo "登录了";
$role = get_role($user_id); // 现在才受 if 控制
}
- 即使单行逻辑,也强制用
{}—— 避免后期加代码时出错 -
else if和elseif功能等价,但推荐用elseif(少一个空格,解析器更稳定) - 比较时优先用
===而非==,避免类型隐式转换引发的意外,比如0 == "abc"居然为true
switch 中的 break 不是可选的
PHP 的 switch 默认会“穿透”,也就是不自动跳出,漏写 break 就会顺序执行后续 case,哪怕值不匹配。这是新手高频翻车点。
$status = 'pending';
switch ($status) {
case 'pending':
echo "处理中";
case 'done': // 没有 break!这里也会执行
echo "已完成"; // 输出:处理中已完成
}
- 每个
case块末尾都得有break,除非你明确需要穿透(极少见) -
default分支建议放在最后,且也要加break,防止未来新增case后逻辑错乱 - 注意:
switch只做松散比较(类似==),如果要严格比类型,得手动用===在case里判断,或者改用if
foreach 遍历数组时小心引用和键名丢失
直接用 foreach ($arr as $item) 是安全的,但一旦加上 & 引用符号,后续对 $item 的修改会反向影响原数组 —— 很多时候这不是你想要的。
立即学习“PHP免费学习笔记(深入)”;
$data = ['a', 'b', 'c'];
foreach ($data as &$item) {
$item = strtoupper($item);
}
// $data 现在变成 ['A','B','C'],原数组被改了
- 如果只是读取,坚决不用
&;真要修改原数组,先确认是否必要 - 遍历时需要键名,必须写成
foreach ($arr as $key => $value),漏掉$key =>就拿不到索引 - 对关联数组用
foreach没问题,但对空数组或null执行会警告,建议前置判空:if (!is_array($arr) || empty($arr)) { ... }
while 和 for 容易陷入死循环
while 最常见的坑是循环变量没更新,或者条件恒真。比如:
$i = 0;
while ($i < 10) {
echo $i;
// 忘了写 $i++; → 死循环
for 则容易在第三部分(递增表达式)写错,比如把 $i++ 写成 $i = $i + 1(语法没错,但可读性差),或误写为 $i-- 导致越跑越远。
-
while适合不确定次数的场景(如数据库分页拉取、文件逐行读取),记得每次迭代都要推进状态 -
for更适合已知次数的循环,三段式结构清晰:for ($i = 0; $i ,但注意 <code>count()别放条件里反复调用,性能差,应提前存变量 - 所有循环都建议设超限保护,比如加计数器或
max_execution_time检查,避免线上卡死
foreach 引用、switch 穿透、while 变量滞留,这些细节一漏,debug 就得花十倍时间。



















