流程控制:条件分支与循环
程序不仅仅是自上而下的执行,它需要具备思考与重复劳动的能力。本页深入讲解 PHP 的条件判断与各种循环结构,并介绍 PHP 8.0 带来的现代化控制语法。
一、if...elseif...else 条件分支
这是最基础的条件判断结构。当条件表达式的结果为布尔值 true 时,执行对应的代码块。
<?php
$score = 85;
if ($score >= 90) {
echo "优秀";
} elseif ($score >= 80) {
echo "良好";
} elseif ($score >= 60) {
echo "及格";
} else {
echo "不及格";
}
// 输出:良好
替代语法 (用于 HTML 模板)
当 PHP 与 HTML 混合编写时,使用大括号 { } 往往会导致代码混乱。PHP 提供了替代语法,使用冒号 : 和关键字 endif。
<?php if ($is_login): ?>
<span>欢迎回来,<?= $user_name ?></span>
<?php else: ?>
<a href="/login.php">请登录</a>
<?php endif; ?>
二、switch 与 PHP 8 的 match 表达式
1. 传统 switch 语句
当需要对同一个变量进行多次等值比较时,switch 比 if 更清晰。注意 break 必不可少,否则会发生"穿透"。
<?php
$day = "Mon";
switch ($day) {
case "Mon":
case "Tue":
case "Wed":
echo "工作日";
break;
case "Sat":
case "Sun":
echo "周末";
break;
default:
echo "未知";
}
2. PHP 8.0+ match 表达式
match 是 PHP 8 引入的 switch 现代替代品。它更安全(严格比较 `===`)、更简洁(直接返回值)、且没有穿透问题。
<?php
$status = 404;
$message = match($status) {
200, 300 => "成功",
404 => "页面未找到",
500 => "服务器错误",
default => "未知状态",
};
echo $message; // 输出:页面未找到
// 注意:match 使用严格比较 (===)
// match(404) 和 match("404") 结果是不同的。
三、循环结构
循环用于重复执行一段代码,直到满足退出条件。PHP 提供了四种循环结构。
1. while 与 do-while 循环
while 先判断条件再执行;do-while 先执行一次再判断条件(至少会执行一次)。
<?php
$i = 1;
while ($i <= 3) {
echo "第 {$i} 次";
$i++;
}
$j = 10;
do {
echo "这里至少执行一次";
} while ($j > 100); // 条件为 false,但上面已执行
2. for 循环
适合已知执行次数的场景。由初始化、条件判断、自增三部分组成。
<?php
// 打印 1 到 5
for ($i = 1; $i <= 5; $i++) {
echo $i . " ";
}
// 输出:1 2 3 4 5
3. foreach 循环 (专门用于数组)
遍历数组最常用的方式,下一章会详细讲数组,这里先看基本用法。
<?php
$users = ["惜梦", "小明", "小红"];
foreach ($users as $user) {
echo $user . " ";
}
// 输出:惜梦 小明 小红
// 带键值对的遍历
$info = ["name" => "PHP", "ver" => 8.0];
foreach ($info as $key => $val) {
echo "{$key}: {$val}; ";
}
// 输出:name: PHP; ver: 8.0;
四、循环控制:break 与 continue
- break:立即终止当前循环。可以接一个数字参数,表示跳出几层循环(如 break 2;)。
- continue:跳过本次循环剩余的代码,直接进入下一次循环。
<?php
for ($i = 1; $i <= 10; $i++) {
if ($i == 5) {
continue; // 跳过数字 5
}
if ($i > 8) {
break; // 遇到 9 时彻底终止循环
}
echo $i . " ";
}
// 输出:1 2 3 4 6 7 8
在嵌套循环中,如果直接写 break;,它只会跳出最内层的循环。如果需要同时跳出外层循环,需要使用 break 2; 或者通过将内层循环封装成函数配合 return 来实现。