控制结构

学习PHP条件语句、循环语句和流程控制

PHP控制结构概述

控制结构是编程语言中用于控制程序执行流程的语句。PHP提供了丰富的控制结构,包括条件语句、循环语句和跳转语句,使程序能够根据不同的条件执行不同的代码块。

控制结构分类:
  • 条件语句: if, else, elseif, switch
  • 循环语句: while, do-while, for, foreach
  • 跳转语句: break, continue, goto

控制结构的重要性

控制结构是编程的基本构建块,它们允许程序根据不同的输入和条件做出决策,实现复杂的逻辑。没有控制结构,程序将只能按顺序执行,无法处理复杂的业务逻辑。

条件语句 - if

if 语句用于在条件为 true 时执行代码。它是PHP中最基本的控制结构之一。

if语句示例
<?php
$age = 20;

// 基本的if语句
if ($age >= 18) {
    echo "您是成年人<br>";
}

// 单行if语句(不推荐)
if ($age >= 18) echo "单行if语句<br>";

// 替代语法(常用于模板中)
if ($age >= 18):
    echo "使用替代语法<br>";
endif;
?>

if语句的工作原理

if语句首先评估括号内的条件表达式。如果结果为true,则执行大括号内的代码块;如果为false,则跳过该代码块。

最佳实践:
  • 始终使用大括号,即使只有一行代码
  • 保持条件表达式简洁明了
  • 在模板中使用替代语法提高可读性

条件语句 - if...else

if...else 语句在条件为 true 时执行一块代码,条件为 false 时执行另一块代码。

if...else语句示例
<?php
$age = 16;

// 基本的if...else语句
if ($age >= 18) {
    echo "您是成年人<br>";
} else {
    echo "您是未成年人<br>";
}

// 替代语法
if ($age >= 18):
    echo "成年人<br>";
else:
    echo "未成年人<br>";
endif;
?>

if...else的应用场景

if...else语句常用于需要两种可能结果的情况,例如:

  • 用户登录验证
  • 权限检查
  • 表单验证
  • 状态判断

条件语句 - if...elseif...else

if...elseif...else 语句用于执行多个条件判断。

if...elseif...else语句示例
<?php
$score = 85;

// 基本的if...elseif...else语句
if ($score >= 90) {
    echo "成绩优秀<br>";
} elseif ($score >= 80) {
    echo "成绩良好<br>";
} elseif ($score >= 60) {
    echo "成绩及格<br>";
} else {
    echo "成绩不及格<br>";
}

// 替代语法
if ($score >= 90):
    echo "优秀<br>";
elseif ($score >= 80):
    echo "良好<br>";
elseif ($score >= 60):
    echo "及格<br>";
else:
    echo "不及格<br>";
endif;
?>

elseif的使用技巧

使用elseif时,条件应按从最严格到最宽松的顺序排列,这样可以提高代码效率。

注意: elseif和else if在PHP中是等价的,但建议使用elseif以保持一致性。

条件语句 - switch

switch 语句用于基于不同条件执行不同动作。它比多个if...elseif语句更简洁,适用于多个固定值的比较。

switch语句示例
<?php
$day = "Monday";

switch ($day) {
    case "Monday":
        echo "今天是星期一<br>";
        break;
    case "Tuesday":
        echo "今天是星期二<br>";
        break;
    case "Wednesday":
        echo "今天是星期三<br>";
        break;
    case "Thursday":
        echo "今天是星期四<br>";
        break;
    case "Friday":
        echo "今天是星期五<br>";
        break;
    default:
        echo "今天是周末<br>";
}

// 多个case共享代码
$number = 3;
switch ($number) {
    case 1:
    case 2:
    case 3:
        echo "数字是1、2或3<br>";
        break;
    case 4:
    case 5:
        echo "数字是4或5<br>";
        break;
    default:
        echo "数字不在1-5范围内<br>";
}
?>
注意: 在每个case后面使用break语句,否则会继续执行下一个case的代码。

switch vs if...elseif

switch语句适用于比较固定值的情况,而if...elseif更适合比较范围或复杂条件。

场景 推荐使用 原因
固定值比较 switch 代码更简洁,执行效率更高
范围比较 if...elseif switch不支持范围比较
复杂条件 if...elseif 可以组合多个条件

循环语句 - while

while 循环在指定条件为 true 时执行代码块。

while循环示例
<?php
// 基本的while循环
$i = 1;
while ($i <= 5) {
    echo "数字: $i<br>";
    $i++;
}

// 替代语法
$j = 1;
while ($j <= 3):
    echo "替代语法: $j<br>";
    $j++;
endwhile;

// 无限循环(谨慎使用)
/*
$k = 1;
while (true) {
    echo "无限循环: $k<br>";
    $k++;
    if ($k > 10) break; // 使用break退出循环
}
*/
?>

while循环的应用场景

while循环适用于不确定循环次数的情况,例如:

  • 读取文件直到文件结束
  • 处理数据库结果集
  • 等待用户输入
  • 处理队列任务

循环语句 - do...while

do...while 循环首先执行一次代码块,然后检查条件,如果条件为 true,重复循环。

do...while循环示例
<?php
// 基本的do...while循环
$i = 1;
do {
    echo "数字: $i<br>";
    $i++;
} while ($i <= 5);

// do...while至少执行一次
$j = 10;
do {
    echo "这个会执行一次: $j<br>";
    $j++;
} while ($j < 5);  // 条件为false,但循环体已执行一次
?>

do...while的特点

do...while循环保证循环体至少执行一次,这是它与while循环的主要区别。

循环语句 - for

for 循环用于已知循环次数的情况。

for循环示例
<?php
// 基本的for循环
for ($i = 1; $i <= 5; $i++) {
    echo "数字: $i<br>";
}

// 替代语法
for ($j = 1; $j <= 3; $j++):
    echo "替代语法: $j<br>";
endfor;

// 复杂的for循环
echo "<br>乘法表:<br>";
for ($i = 1; $i <= 9; $i++) {
    for ($j = 1; $j <= $i; $j++) {
        echo "$j×$i=" . ($j * $i) . " ";
    }
    echo "<br>";
}
?>

for循环的结构

for循环由三个表达式组成:

  1. 初始化表达式: 在循环开始前执行一次
  2. 条件表达式: 在每次循环开始前检查
  3. 递增表达式: 在每次循环结束后执行
提示: for循环的三个表达式都可以为空,但分号必须保留。

循环语句 - foreach

foreach 循环用于遍历数组。

foreach循环示例
<?php
// 遍历索引数组
$colors = ["红色", "绿色", "蓝色"];

echo "遍历索引数组:<br>";
foreach ($colors as $color) {
    echo "颜色: $color<br>";
}

// 遍历关联数组
$person = [
    "name" => "张三",
    "age" => 25,
    "city" => "北京"
];

echo "<br>遍历关联数组:<br>";
foreach ($person as $key => $value) {
    echo "$key: $value<br>";
}

// 替代语法
echo "<br>使用替代语法:<br>";
foreach ($colors as $color):
    echo "颜色: $color<br>";
endforeach;
?>
注意: 数组将在专门的数组章节中详细讲解。

foreach循环的优势

foreach循环是遍历数组最简单、最安全的方式,因为它:

  • 自动处理数组索引
  • 不会出现越界错误
  • 代码简洁易读
  • 适用于所有类型的数组

跳转语句 - break 和 continue

break 和 continue 语句用于控制循环的执行。

break和continue示例
<?php
// break示例 - 提前退出循环
echo "break示例:<br>";
for ($i = 1; $i <= 10; $i++) {
    if ($i == 6) {
        break;  // 当$i等于6时退出循环
    }
    echo "$i ";
}
echo "<br>循环结束<br><br>";

// continue示例 - 跳过当前迭代
echo "continue示例:<br>";
for ($i = 1; $i <= 10; $i++) {
    if ($i % 2 == 0) {
        continue;  // 跳过偶数
    }
    echo "$i ";  // 只输出奇数
}
echo "<br>循环结束<br><br>";

// 指定跳出层数
echo "多层循环break:<br>";
for ($i = 1; $i <= 3; $i++) {
    for ($j = 1; $j <= 3; $j++) {
        if ($i == 2 && $j == 2) {
            break 2;  // 跳出两层循环
        }
        echo "i=$i, j=$j<br>";
    }
}
?>

break和continue的区别

语句 作用 应用场景
break 完全退出循环 找到目标后提前结束循环
continue 跳过当前迭代,继续下一次循环 跳过不符合条件的元素

goto 语句

goto 语句用于跳转到程序中指定的位置。

goto语句示例
<?php
$i = 0;

start:
echo "i = $i<br>";
$i++;

if ($i < 5) {
    goto start;  // 跳转到start标签
}

echo "循环结束<br>";

// 使用goto跳出多层循环
for ($i = 1; $i <= 3; $i++) {
    for ($j = 1; $j <= 3; $j++) {
        if ($i == 2 && $j == 2) {
            goto end;
        }
        echo "i=$i, j=$j<br>";
    }
}

end:
echo "使用goto跳出循环<br>";
?>
注意: 过度使用goto语句会使代码难以理解和维护,应谨慎使用。在大多数情况下,可以使用其他控制结构替代goto。

控制结构最佳实践

代码可读性

  • 使用有意义的变量名和函数名
  • 保持条件表达式简洁
  • 适当使用空格和缩进
  • 添加必要的注释

性能优化

  • 在循环外计算不变的表达式
  • 使用最适合的循环类型
  • 避免在循环内执行数据库查询
  • 使用break提前退出循环

错误处理

  • 检查循环条件避免无限循环
  • 处理可能的边界情况
  • 使用try-catch处理异常

实践练习

创建一个PHP程序,实现以下功能:

  1. 使用if...elseif...else实现成绩评级系统
  2. 使用switch语句实现星期几的判断
  3. 使用for循环输出乘法表
  4. 使用while循环计算1到100的和
  5. 使用foreach循环遍历数组
  6. 使用break和continue控制循环流程
提示: 可以创建一个综合的程序,如学生成绩管理系统,使用各种控制结构处理不同逻辑。

扩展练习

尝试实现以下更复杂的程序:

  • 用户登录系统,根据用户角色显示不同内容
  • 商品筛选系统,根据多个条件筛选商品
  • 分页显示系统,使用循环生成分页链接