一、开篇:为什么你的代码总像个“铁憨憨”?
你有没有遇到过这种情况——写了个用户登录功能,不管用户输入啥,程序都一视同仁地往下执行?就像个不看红灯硬闯路口的行人,或者像去餐厅吃饭,服务员根本不问你点什么,直接端上来一盘香菜炒月饼(如果你爱吃,当我没说)。
这就是缺了流程控制的典型症状!
简单说,流程控制就是教代码:
- 什么时候该做什么(条件判断)
- 什么事情该重复做(循环执行)
- 什么时候该岔开走(分支选择)
今天咱们不用那些拗口的教科书定义,就用人话+实战,让你彻底搞懂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使用要点:
switch后面的变量会被逐个与case比较- 匹配到哪个
case就从那里开始执行 break是“停止执行,跳出switch”- 没有
break会继续执行下一个case的代码(除非故意需要这种效果) 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循环三要素:
- 初始值:
$i = 1(循环从哪开始) - 条件:
$i <= 9(满足条件才继续循环) - 步进:
$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 性能小贴士
- 能用switch就别用一长串if-elseif(switch有跳转表,效率更高)
- 循环前计算好长度,别在条件里每次都计算
// 不好
for ($i = 0; $i < count($大数据数组); $i++) { ... }
// 好
$长度 = count($大数据数组);
for ($i = 0; $i < $长度; $i++) { ... }
- foreach在只读遍历时最快,但不要修改原数组
八、总结:让你的代码“活”起来
流程控制就像教代码“看情况办事”:
- if家族:处理“如果...那么...”的决策
- switch:处理“多种固定选项”的选择
- 循环:处理“重复劳动”的自动化
记住这个比喻:
写没有流程控制的代码,就像让外卖小哥不管你在不在家都直接把外卖挂门上。
而有流程控制的代码,是让小哥先打电话问你在不在家,不在就放快递柜,在家就送上门,下雨了还用塑料袋包好。
最终建议:
- 先想清楚业务逻辑,再写代码
- 复杂的条件可以拆分成多个if,别硬挤在一行
- 适当添加注释,特别是复杂的循环和嵌套
- 多用流程图辅助思考
现在打开你的代码编辑器,把之前那些“直男式”的平铺代码改造一下吧!让你的程序学会“见机行事”,从此告别“铁憨憨”代码时代!
延伸思考:
如果你已经掌握了这些,下次我们可以聊聊更高级的“函数封装”——如何把常用的流程控制模式打包成“即食工具”,让你写代码像点外卖一样简单。比如说,把整个登录验证流程封装成一个函数checkLogin(),下次直接用,岂不美哉?
1万+

被折叠的 条评论
为什么被折叠?



