PHP基础教程(51)PHP流程控制语句:别让你的PHP代码像无头苍蝇!流程控制让程序“学会思考”的完整指南

一、开篇:为什么你的代码总像个“铁憨憨”?

你有没有遇到过这种情况——写了个用户登录功能,不管用户输入啥,程序都一视同仁地往下执行?就像个不看红灯硬闯路口的行人,或者像去餐厅吃饭,服务员根本不问你点什么,直接端上来一盘香菜炒月饼(如果你爱吃,当我没说)。

这就是缺了流程控制的典型症状!

简单说,流程控制就是教代码:

  • 什么时候该做什么(条件判断)
  • 什么事情该重复做(循环执行)
  • 什么时候该岔开走(分支选择)

今天咱们不用那些拗口的教科书定义,就用人话+实战,让你彻底搞懂PHP怎么“带脑子”执行任务。放心,连你那个总说“编程太难”的表弟都能看懂!

二、if语句:程序界的“如果...就...”

2.1 基础版:单条件判断
<?php
$钱包余额 = 50;
$奶茶价格 = 25;

if ($钱包余额 >= $奶茶价格) {
    echo "老板,来杯杨枝甘露!加波波!";
    $钱包余额 = $钱包余额 - $奶茶价格; // 记得扣钱
}
?>

解读:
这就跟你心里盘算“如果我钱够,就买奶茶”一模一样。if后面小括号里是条件,大括号里是满足条件时要执行的代码。注意:条件判断要用>=而不是>,不然你刚好有25元时,程序会觉得你买不起(程序很抠门的)。

2.2 升级版:if-else(二选一)
<?php
$天气 = "暴雨";
$带伞 = false;

if ($天气 == "暴雨" || $天气 == "大雨") { // 双保险判断
    echo "天气播报:今天下雨,记得带伞!";
    $带伞 = true;
} else {
    echo "天气不错,可以晒被子了~";
    $带伞 = false;
}

// 实际执行动作
if ($带伞) {
    echo "<br>实际行动:带上了我的小猫雨伞";
} else {
    echo "<br>实际行动:轻装上阵";
}
?>

重点提示:

  • || 表示“或者”,满足一个条件就算成立
  • == 是比较相等,别写成 =(那是赋值!常见新手错误)
  • 花括号要对齐,养成好习惯,不然代码像被猫抓过
2.3 豪华版:if-elseif-else(多选一)
<?php
$考试成绩 = 85;

if ($考试成绩 >= 90) {
    $评价 = "学霸!今晚鸡腿加餐!";
    $奖励 = "新游戏皮肤";
} elseif ($考试成绩 >= 80) { // 注意是elseif不是else if(PHP里两种都可以,但推荐这种)
    $评价 = "考得不错,继续保持";
    $奖励 = "一杯奶茶";
} elseif ($考试成绩 >= 60) {
    $评价 = "及格了,但别高兴太早";
    $奖励 = "习题册一套";
} else {
    $评价 = "准备接受爸妈的‘关爱’吧...";
    $奖励 = "补习班体验月卡";
}

echo "分数:{$考试成绩}<br>";
echo "评价:{$评价}<br>";
echo "奖励:{$奖励}";
?>

实际场景应用:
用户等级判断(普通/VIP/超级VIP)、订单状态处理(待付款/已发货/已完成)、权限检查等等。

三、switch语句:当if-else长得像老太太的裹脚布

如果你要判断的情况超过5种,if-elseif-else会写得你手抽筋,这时候就该switch出场了!

3.1 基础switch用法
<?php
$今天星期几 = "周三";

switch ($今天星期几) {
    case "周一":
        echo "困成狗,不想上班";
        break; // 必须加break,不然会“贯穿”执行后面的
    case "周二":
        echo "稍微清醒点了";
        break;
    case "周三":
        echo "周中了,坚持住!";
        break;
    case "周四":
        echo "假装很忙";
        break;
    case "周五":
        echo "周末倒计时开始!";
        break;
    case "周六":
    case "周日": // 两个case可以连一起写
        echo "睡到自然醒";
        break;
    default: // 以上都不匹配时执行
        echo "你输入的是地球上的星期吗?";
}
?>
3.2 switch经典实战:简单的命令行计算器
<?php
$操作 = "+";
$数字1 = 10;
$数字2 = 5;
$结果 = 0;

switch ($操作) {
    case "+":
        $结果 = $数字1 + $数字2;
        echo "计算结果:{$数字1} + {$数字2} = {$结果}";
        break;
    case "-":
        $结果 = $数字1 - $数字2;
        echo "计算结果:{$数字1} - {$数字2} = {$结果}";
        break;
    case "*":
        $结果 = $数字1 * $数字2;
        echo "计算结果:{$数字1} × {$数字2} = {$结果}";
        break;
    case "/":
        if ($数字2 != 0) {
            $结果 = $数字1 / $数字2;
            echo "计算结果:{$数字1} ÷ {$数字2} = {$结果}";
        } else {
            echo "错误:除数不能为零!";
        }
        break;
    default:
        echo "不支持的操作符,请使用 + - * / 之一";
}

// 输出:计算结果:10 + 5 = 15
?>

switch使用要点:

  1. switch后面的变量会被逐个与case比较
  2. 匹配到哪个case就从那里开始执行
  3. break是“停止执行,跳出switch”
  4. 没有break会继续执行下一个case的代码(除非故意需要这种效果)
  5. default是可选的,但建议总是加上,处理意外情况

四、循环语句:让代码替你“搬砖”

4.1 for循环:当你明确知道要搬多少次砖
<?php
// 场景:打印九九乘法表的一部分
echo "开始背乘法口诀:<br>";
for ($i = 1; $i <= 9; $i++) { // $i++ 相当于 $i = $i + 1
    echo "5 × {$i} = " . (5 * $i) . "<br>";
}

// 更实用的例子:批量处理数组
$学生列表 = ["小明", "小红", "小刚", "小芳"];
$学生数量 = count($学生列表); // 获取数组元素个数

echo "<br>点名开始:<br>";
for ($序号 = 0; $序号 < $学生数量; $序号++) {
    echo "第" . ($序号 + 1) . "号:" . $学生列表[$序号] . "<br>";
}
?>

for循环三要素:

  1. 初始值$i = 1(循环从哪开始)
  2. 条件$i <= 9(满足条件才继续循环)
  3. 步进$i++(每次循环后怎么变化)
4.2 while循环:当你不确定要搬多少砖,但有停止条件
<?php
// 场景:抽卡直到抽到SSR(非洲人预警)
$抽卡次数 = 0;
$抽到SSR = false;
$概率 = 0.01; // 1%概率

while (!$抽到SSR) { // 只要没抽到SSR就继续抽
    $抽卡次数++;
    echo "第{$抽卡次数}抽:白光一闪...";
    
    // 模拟随机结果
    if (mt_rand(1, 100) <= ($概率 * 100)) {
        $抽到SSR = true;
        echo "金光!出SSR了!<br>";
        echo "总计花费:" . ($抽卡次数 * 10) . "元";
        break; // 跳出循环
    } else {
        echo "又是R卡...<br>";
    }
    
    // 安全措施:防止无限循环
    if ($抽卡次数 >= 1000) {
        echo "<br>抽了1000次还没出,建议今天洗手再来";
        break;
    }
}
?>
4.3 do-while循环:先干再说,至少执行一次
<?php
// 场景:用户必须同意协议才能继续
do {
    echo "====== 用户协议 ======<br>";
    echo "1. 不准用外挂<br>";
    echo "2. 不准骂人<br>";
    echo "3. 不准...<br><br>";
    
    $用户选择 = "同意"; // 实际中这里应该是表单提交的值
    echo "用户选择:{$用户选择}<br>";
    
} while ($用户选择 != "同意"); // 只要不同意,就一直显示协议

echo "欢迎进入游戏!";
?>

while vs do-while:

  • while:先检查条件,再决定是否执行
  • do-while:先执行一次,再检查条件(至少执行一次
4.4 foreach循环:处理数组的“专属神器”
<?php
// 最常用的数组遍历方式
$商品价格 = [
    "奶茶" => 25,
    "汉堡" => 30,
    "薯条" => 15,
    "鸡翅" => 20
];

echo "今日菜单:<br>";
foreach ($商品价格 as $商品名 => $价格) {
    echo "{$商品名}:{$价格}元<br>";
}

// 如果只需要值,不要键
$总分 = 0;
$各科成绩 = [85, 92, 78, 88, 95];

foreach ($各科成绩 as $成绩) {
    $总分 += $成绩; // 累加总分
}

echo "<br>平均分:" . ($总分 / count($各科成绩));
?>

foreach优势:

  • 自动遍历数组每个元素
  • 不用担心下标越界
  • 代码更简洁易读

五、流程控制的“骚操作”和高级技巧

5.1 循环控制:break和continue
<?php
// break:完全跳出循环
echo "找数字7游戏:<br>";
for ($i = 1; $i <= 10; $i++) {
    if ($i == 7) {
        echo "找到了!数字7在位置{$i}<br>";
        break; // 找到后就停止循环
    }
    echo "正在检查{$i}...<br>";
}

echo "<br>--- 分割线 ---<br>";

// continue:跳过本次循环,继续下一次
echo "打印1-10的奇数:<br>";
for ($j = 1; $j <= 10; $j++) {
    if ($j % 2 == 0) { // 如果是偶数
        continue; // 跳过这次循环
    }
    echo "{$j} ";
}
// 输出:1 3 5 7 9
?>
5.2 嵌套循环和标签跳出
<?php
// 嵌套循环:循环里的循环
echo "排列组合示例:<br>";
for ($外层 = 1; $外层 <= 3; $外层++) {
    for ($内层 = 1; $内层 <= 3; $内层++) {
        echo "({$外层},{$内层}) ";
    }
    echo "<br>";
}

// 使用标签跳出多层循环
echo "<br>多层跳出示例:<br";
$目标 = 5;
外层循环:
for ($x = 1; $x <= 3; $x++) {
    for ($y = 1; $y <= 3; $y++) {
        $值 = $x * 10 + $y;
        echo "检查{$值}...<br>";
        
        if ($值 == $目标) {
            echo "找到目标{$目标}!<br>";
            break 外层循环; // 直接跳出外层循环
        }
    }
}
?>

六、实战:用流程控制做个“智能”登录系统

<?php
// 模拟用户数据库
$用户数据库 = [
    "admin" => ["密码" => "123456", "权限" => "管理员"],
    "user1" => ["密码" => "111111", "权限" => "普通用户"],
    "vip" => ["密码" => "888888", "权限" => "VIP用户"]
];

// 用户输入(实际从表单获取)
$输入用户名 = "admin";
$输入密码 = "123456";
$验证码输入 = "ABCD";
$验证码正确 = true;

// 智能登录验证流程
if (!$验证码正确) {
    echo "验证码错误!";
    exit; // 直接结束脚本
}

if (!array_key_exists($输入用户名, $用户数据库)) {
    echo "用户名不存在!";
} else {
    $用户信息 = $用户数据库[$输入用户名];
    
    if ($输入密码 != $用户信息["密码"]) {
        echo "密码错误!";
        
        // 模拟密码错误次数限制
        $错误次数 = 0;
        while ($错误次数 < 3) {
            $错误次数++;
            echo "您还有" . (3 - $错误次数) . "次尝试机会<br>";
            
            if ($错误次数 == 3) {
                echo "账户已锁定,请30分钟后重试";
                break;
            }
        }
    } else {
        // 登录成功,根据权限跳转
        switch ($用户信息["权限"]) {
            case "管理员":
                echo "欢迎管理员!进入管理后台...";
                // 这里可以是header跳转
                break;
            case "VIP用户":
                echo "尊贵的VIP,为您展示专属内容...";
                break;
            case "普通用户":
                echo "登录成功,开始浏览...";
                break;
            default:
                echo "登录成功,权限未知";
        }
    }
}

// 登录后的操作菜单(模拟)
echo "<br><br>=== 功能菜单 ===<br>";
$菜单选项 = ["1.查看资料", "2.修改密码", "3.退出登录"];

foreach ($菜单选项 as $索引 => $选项) {
    echo ($索引 + 1) . ". " . substr($选项, 3) . "<br>";
}

// 根据用户选择执行不同操作
$用户选择 = 2; // 模拟用户选择了2
switch ($用户选择) {
    case 1:
        echo "<br>正在加载您的资料...";
        break;
    case 2:
        echo "<br>进入密码修改流程:";
        // 模拟修改密码(需要确认新密码)
        $新密码 = "newpass";
        $确认密码 = "newpass";
        
        if ($新密码 == $确认密码) {
            echo "密码修改成功!";
        } else {
            echo "两次输入不一致!";
            // 可以在这里循环要求重新输入
        }
        break;
    case 3:
        echo "<br>正在退出...";
        break;
}
?>

七、避坑指南和最佳实践

7.1 常见错误
<?php
// 错误1:在条件判断里赋值
$温度 = 25;
if ($温度 = 30) { // 错误!应该是 == 或 ===
    echo "永远会执行这里,因为赋值成功返回true";
}

// 正确写法
if ($温度 == 30) {
    echo "只有当温度等于30时才执行";
}

// 错误2:循环里修改数组
$数组 = [1, 2, 3, 4];
foreach ($数组 as $值) {
    echo $值;
    // $数组[] = $值 * 2; // 危险!会导致无限循环
}

// 正确做法:先复制或使用新数组
$新数组 = [];
foreach ($数组 as $值) {
    $新数组[] = $值 * 2;
}

// 错误3:switch忘记写break
$状态 = "成功";
switch ($状态) {
    case "成功":
        echo "处理成功逻辑";
        // 忘记break,会继续执行下面的case!
    case "失败":
        echo "处理失败逻辑";
        break;
}
?>
7.2 性能小贴士
  1. 能用switch就别用一长串if-elseif(switch有跳转表,效率更高)
  2. 循环前计算好长度,别在条件里每次都计算
// 不好
for ($i = 0; $i < count($大数据数组); $i++) { ... }

// 好
$长度 = count($大数据数组);
for ($i = 0; $i < $长度; $i++) { ... }
  1. foreach在只读遍历时最快,但不要修改原数组

八、总结:让你的代码“活”起来

流程控制就像教代码“看情况办事”:

  • if家族:处理“如果...那么...”的决策
  • switch:处理“多种固定选项”的选择
  • 循环:处理“重复劳动”的自动化

记住这个比喻:

写没有流程控制的代码,就像让外卖小哥不管你在不在家都直接把外卖挂门上。
而有流程控制的代码,是让小哥先打电话问你在不在家,不在就放快递柜,在家就送上门,下雨了还用塑料袋包好。

最终建议:

  1. 先想清楚业务逻辑,再写代码
  2. 复杂的条件可以拆分成多个if,别硬挤在一行
  3. 适当添加注释,特别是复杂的循环和嵌套
  4. 多用流程图辅助思考

现在打开你的代码编辑器,把之前那些“直男式”的平铺代码改造一下吧!让你的程序学会“见机行事”,从此告别“铁憨憨”代码时代!


延伸思考:
如果你已经掌握了这些,下次我们可以聊聊更高级的“函数封装”——如何把常用的流程控制模式打包成“即食工具”,让你写代码像点外卖一样简单。比如说,把整个登录验证流程封装成一个函数checkLogin(),下次直接用,岂不美哉?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值