第三章-PHP流程控制语句
PHP流程控制语句一,PHP流程控制
流程控制是编程中用于 管理代码执行顺序和逻辑分支 的核心机制。它通过 条件判断(如 if、switch)、循环执行(如 for、while)和 跳转指令(如 break、continue),决定步伐在不同场景下运行的路径,确保代码按预期逻辑处理数据或完成使命。简而言之,它是步伐逻辑的“交通指挥”,控制代码的走向和重复行为。
1.条件语句
[*] if / elseif / else
[*] switch
2.循环语句
[*] for 循环
[*] foreach 遍历
3.跳转语句
[*] break 和 continue
[*] goto
4.性能优化策略
[*]减少循环内部计算:
[*]将静态计算(如 count())移到循环外。
[*]优先选择 foreach:
[*]比 for 更高效,尤其是处理关联数组。
[*]避免深层嵌套:
[*]超过 3 层嵌套时,考虑用函数或策略模式解耦。
总结:流程控制的最佳实践
场景推荐结构避免的陷阱多条件判断switch 或 match (PHP 8+)忘记 break 导致穿透数组遍历foreach引用变量未 unset未知次数的循环while / do-while缺少制止条件导致无限循环模板中的条件渲染更换语法 (if(): ... endif)混淆 PHP 和 HTML 的缩进 二,流程控制语句分类
一、条件语句(分支控制)
用于根据条件选择执行路径:
[*] if / elseif / else
基础条件判断,支持嵌套。
if ($score > 90) {
echo "优秀";
} elseif ($score > 60) {
echo "及格";
} else {
echo "不及格";
}
[*] switch
多分支选择(松散比力 ==),需配合 break 防止穿透。
switch ($day) {
case "Mon":
echo "周一";
break;
default:
echo "其他";
}
[*] match(PHP 8+)
更简便的多分支结构(严酷比力 ===),直接返回值。
echo match($status) {
200 => "成功",
404 => "未找到",
default => "未知状态"
};
二、循环语句(重复执行)
用于重复执行代码块:
[*] for
已知循环次数时利用。
for ($i = 0; $i < 5; $i++) {
echo $i; // 输出 0 到 4
}
[*] while
条件前置循环,可能一次都不执行。
while ($i < 5) {
echo $i++;
}
[*] do-while
条件后置循环,至少执行一次。
do {
echo $i++;
} while ($i < 5);
[*] foreach
专为遍历数组/对象筹划,高效且安全。
$colors = ["红", "绿", "蓝"];
foreach ($colors as $color) {
echo $color;
}
三、跳转语句(流程中断)
用于中断或跳过代码执行:
[*] break
退出当前循环或 switch 结构,支持指定跳出层数(如 break 2)。
while (true) {
if ($x > 5) break;
$x++;
}
[*] continue
跳过当前循环的剩余代码,进入下一次迭代。
for ($i = 0; $i < 10; $i++) {
if ($i % 2 == 0) continue;
echo $i; // 输出奇数
}
[*] goto
跳转到指定标签(慎用,易粉碎代码结构)。
goto jump;
echo "这行不执行";
jump:
echo "跳转到这里";
四、更换语法(模板专用)
用 : 和 endXXX 更换花括号,提升代码可读性(常用于视图模板):
[*] if 更换语法
<?php if ($loggedIn): ?>
<p>已登录</p>
<?php else: ?>
<p>未登录</p>
<?php endif; ?>
[*] foreach 更换语法
<?php foreach ($items as $item): ?>
<li><?= $item ?></li>
<?php endforeach; ?>
总结
分类典范语句核心用途条件语句if、switch、match根据条件选择执行路径循环语句for、while、foreach重复执行代码块跳转语句break、continue、goto中断或跳过代码执行更换语法if(): ... endif;提升模板代码可读性 三,顺序结构
在 PHP 中,顺序结构是最基础的步伐执行方式,指代码按照 从上到下、逐行执行 的顺序运行,没有分支或循环的干预。它是全部步伐的默认执行逻辑,除非通过流程控制语句(如 if、for 等)改变了执行路径。
一、顺序结构的特点
[*]线性执行
代码从第一行开始,依次执行到文件末尾。
[*]无跳转
不涉及条件判断或循环,严酷按照誊写顺序运行。
[*]简单直观
恰当处理步骤明白、无需分支的使命。
二、示例代码
<?php
// 顺序结构示例
$name = "Alice"; // 1. 定义变量
echo "Hello, $name!";// 2. 输出内容
$age = 25; // 3. 定义变量
echo "Age: $age"; // 4. 再次输出
?>
执行顺序:
1 → 2 → 3 → 4,依次输出:
Hello, Alice!
Age: 25
三、顺序结构的常见场景
[*] 初始化配置
$dbHost = 'localhost';
$dbUser = 'root';
$dbPass = 'password';
// 后续使用这些配置连接数据库
[*] 数据处理流水线
$data = file_get_contents('data.json'); // 1. 读取文件
$dataArray = json_decode($data, true);// 2. 解析 JSON
array_filter($dataArray); // 3. 过滤数据
[*] 模板渲染
<html>
<body>
<?php
$title = "欢迎页"; // 1. 定义变量
echo "<h1>$title</h1>"; // 2. 输出标题
?>
<p>当前时间:<?= date('Y-m-d') ?></p>// 3. 输出时间
</body>
</html>
四、顺序结构的留意事项
[*] 依赖顺序
变量的定义必须在 利用之前,否则会报错:
echo $undefinedVar; // 错误:变量未定义
$undefinedVar = 10;
[*] 函数/类的定义位置
函数和类需要 先定义后调用(除非利用主动加载):
hello(); // 错误:函数未定义
function hello() { echo "Hi!"; }
[*] 包含文件的影响
利用 include 或 require 时,被包含文件的代码会 按顺序插入到当前位置:
include 'config.php'; // 先执行 config.php 中的代码
echo "加载完成"; // 后执行
五、顺序结构 vs 其他结构
结构类型特点示例场景顺序结构逐行执行,无分支或循环初始化配置、数据流水线条件结构根据条件选择执行路径(if、switch)用户权限判断、错误处理循环结构重复执行代码块(for、while)遍历数组、批量处理数据 总结
PHP 的顺序结构是代码执行的默认模式,恰当处理步骤明白、无需逻辑分支的使命。关键要点:
[*]严酷按誊写顺序执行
[*]留意变量/函数定义的位置
[*]避免隐式依赖导致错误
四,分支结构
在 PHP 中,分支结构(条件语句)用于根据不同的条件执行不同的代码路径。以下是 PHP 分支结构的详细分类、语法、特性及最佳实践:
一、分支结构的核心类型
1. 单条件 if
[*] 用途:当条件满足时执行代码块。
[*] 语法:
if (条件) {
// 条件为真时执行
}
[*] 示例:
$age = 18;
if ($age >= 18) {
echo "成年人";
}
2. if + else
[*] 用途:二选一逻辑。
[*] 语法:
if (条件) {
// 条件为真时执行
}
else { // 条件为假时执行}
[*] 示例:
$isRaining = true;
if ($isRaining) {
echo "带伞";
} else {
echo "不用带伞";
}
3. if + elseif + else
[*] 用途:多条件分支判断。
[*] 语法:
if (条件1) {
// 条件1为真时执行
} elseif (条件2) {
// 条件2为真时执行
} else {
// 其他情况执行
}
[*] 示例:
$score = 75;
if ($score >= 90) {
echo "优秀";
} elseif ($score >= 70) {
echo "良好";
} elseif ($score >= 60) {
echo "及格";
} else {
echo "不及格";
}
4. 嵌套 if
[*] 用途:处理多层条件逻辑。
[*] 示例:
$isMember = true;
$totalPrice = 200;
if ($isMember) {
if ($totalPrice > 100) {
echo "会员享受9折优惠";
} else {
echo "会员无折扣";
}
} else {
echo "非会员原价购买";
}
5. 更换语法(模板场景)
[*] 用途:在 HTML 中混淆 PHP 时提升可读性。
[*] 示例:
<?php if ($userLoggedIn): ?>
<div class="welcome">欢迎回来,<?= $username ?></div>
<?php else: ?>
<a href="/login">请登录</a>
<?php endif; ?>
6. 与逻辑运算符结合
[*] 用途:简化复杂条件。
[*] 示例:
$age = 25;
$hasLicense = true;
// 使用 &&(逻辑与)
if ($age >= 18 && $hasLicense) {
echo "允许驾驶";
}
// 使用 ||(逻辑或)
$isWeekend = true;
$isHoliday = false;
if ($isWeekend || $isHoliday) {
echo "休息日";
}
7.switch条件匹配
基础语法与示例
switch ($value) {
case 1:
echo "数值 1";
break;
case "1":
echo "字符串 '1'"; // 不会执行(松散比较 1 == "1")
break;
default:
echo "默认值";
}
关键特性
[*] 松散比力陷阱:
$value = "0";
switch ($value) {
case 0: // 成立("0" == 0)
echo "匹配到 0";
break;
}
[*] 穿透的合理利用:
switch ($day) {
case "Mon":
case "Tue":
case "Wed":
echo "工作日"; // 合并多个 case
break;
case "Sat":
case "Sun":
echo "周末";
break;
}
常见陷阱
[*] 忘记 break:
switch ($x) {
case 1:
echo "1"; // 若未写 break,会继续执行 case 2
case 2:
echo "2";
break;
}
[*] 非标量类型比力:
$obj = new stdClass();
switch ($obj) {
case new stdClass(): // 永远不匹配(对象比较的是标识)
echo "对象匹配";
break;
}
8.match条件匹配
1.基础语法与示例
$result = match ($statusCode) {
200 => "成功",
404 => "未找到",
500 => "服务器错误",
default => "未知状态"
};
echo $result; // 直接使用返回值
2.关键特性
[*] 严酷类型安全:
match ("0") {
0 => "不会匹配", // "0" !== 0
"0" => "匹配成功"// 严格匹配
};
[*] 表达式特性:
$discount = match (true) {
$totalPrice > 200 => 0.2,
$totalPrice > 100 => 0.1,
default => 0
};
3. 限制与陷阱
[*] 必须穷尽全部可能:
// 错误:未处理其他情况且无 default
match ($code) {
200 => "成功"
};
[*] 条件必须为表达式:
// 错误:不能写复杂代码块
match ($x) {
1 => {
echo "处理逻辑"; // 不允许
return "结果";
}
};
9.switch 与 match 的对比
特性switchmatch(PHP 8+)比力方式松散比力(==)严酷比力(===)返回值无返回值,需手动输出或赋值直接返回值,恰当表达式场景穿透行为默认穿透,需 break 阻断主动阻断穿透,无需 break语法简便性冗长(需 case 和 break)简便(箭头语法 =>)适用场景多分支松散匹配,复杂逻辑严酷匹配,直接返回值的场景 1.switch 的跳转表优化
[*]PHP 会将 switch 的 case 值编译为 跳转表(Jump Table),使得多分支时执行效率接近 O(1)。
[*]适用场景:分支数目多且为连续整数时性能最佳。
2. match 的线性检查
[*]match 按代码顺序依次检查条件,雷同 if-elseif 链,时间复杂度为 O(n)。
[*]适用场景:分支较少或需要严酷类型匹配时更安全。
二、分支结构的底层机制
1. 条件判断逻辑
[*]if 的执行顺序:PHP 按代码顺序依次检查条件,直到找到第一个为 true 的分支。
[*]switch 的松散比力:利用 == 进行比力,可能导致类型转换(如 "0" == 0 为 true)。
[*]match 的严酷性:利用 === 比力,避免类型转换带来的意外匹配。
2. 性能优化
[*]if 的条件顺序:将 最可能成立的条件 前置,减少判断次数。
[*]switch vs if-else:
[*]当分支较多时(如超过 5 个),switch 通常比 if-else 更高效。
[*]switch 通过跳转表(Jump Table)优化执行速度。
三、关键陷阱与办理方案
1. switch 的穿透题目
[*] 题目:忘记写 break 导致代码穿透执行多个 case。
switch ($day) {
case "Mon":
echo "周一";
// 未写 break,穿透到下一个 case
case "Tue":
echo "周二";
break;
}
// 输入 "Mon" 会输出 "周一周二"
[*] 办理:
[*]明白添加 break 或 return。
[*]利用 match 更换(主动阻断穿透)。
2. 条件中的赋值陷阱
[*] 题目:误用 =(赋值)代替 ==(比力)。
if ($isAdmin = true) { // 赋值操作,条件永远为真!
// 错误逻辑
}
[*] 办理:
[*]利用严酷比力:if ($isAdmin === true)。
[*]IDE 静态检查工具(如 PhpStorm)可提示此类错误。
3. 类型敏感的 case 匹配
[*] 题目:switch 的松散比力导致类型不敏感匹配。
$input = "0"; // 字符串 "0"
switch ($input) {
case 0: // 匹配成功("0" == 0)
echo "危险!";
break;
}
[*] 办理:
[*] 利用 match(严酷比力)或前置类型转换:
$input = (int)$input; // 转换为整数
四、最佳实践总结
场景推荐结构理由少量简单条件if / else直观易读,恰当简单逻辑多固定值匹配switch 或 match代码更简便,性能更优严酷类型匹配match(PHP 8+)避免类型转换隐患动态条件或复杂逻辑if 嵌套(但避免超过3层)灵活处理复杂条件 代码示例对比
// 使用 if-else
if ($status === 200) {
$message = "成功";
} elseif ($status === 404) {
$message = "未找到";
} else {
$message = "未知错误";
}
// 使用 match(更简洁)
$message = match ($status) {
200 => "成功",
404 => "未找到",
default => "未知错误"
};
五、流程图解:分支结构执行逻辑
if-else 流程
条件1成立 → 执行代码块1
↓ 不成立
条件2成立 → 执行代码块2
↓ 不成立
执行 else 代码块
switch 流程
表达式 → 匹配 case 值 → 执行对应代码块 → break 退出
↓ 无匹配 → 执行 default
总结
PHP 的分支结构是控制步伐逻辑的核心工具,合理利用 if、switch 和 match 可以明显提升代码的可读性和性能。关键留意事项:
[*]鉴戒 switch 的穿透和松散比力题目。
[*]优先利用 match(PHP 8+)实现严酷类型匹配。
[*]避免深层嵌套,通过拆分逻辑或筹划模式优化代码结构。
五,循环结构
在 PHP 中,循环结构用于重复执行代码块,是处理重复使命的核心工具。以下是 PHP 循环结构的 详细分类、利用场景、技能细节 和 最佳实践,结合代码示例全面剖析。
一、PHP 循环结构分类
循环类型语法核心用途forfor (初始化; 条件; 递增) { ... }已知循环次数的场景whilewhile (条件) { ... }条件前置的未知次数循环do-whiledo { ... } while (条件);条件后置的循环(至少执行一次)foreachforeach ($array as $value) { ... }遍历数组或对象 二、循环结构详解与示例
1. for 循环
for (初始化; 条件; 迭代) {
// 循环体
}
[*] 场景:明白循环次数(如遍历索引数组)。
[*] 语法剖析:
初始化:在循环开始前执行一次(通常用于定义循环变量)。
条件:每次循环迭代前都会检查这个条件,假如为 true,则继续循环;否则制止循环。
迭代:每次循环结束后执行(通常用于更新循环变量)。
[*] 示例:
for ($i = 0; $i < 5; $i++) {
echo $i; // 输出 0,1,2,3,4
}
[*] 优化技巧:
// 错误:每次循环调用 count($arr)
for ($i=0; $i < count($arr); $i++) { ... }
// 正确:预先计算长度
$len = count($arr);
for ($i=0; $i < $len; $i++) { ... }
2. while 循环
[*] 场景:条件满足时重复执行(如读取文件直到结束)。
[*] 示例:
$i = 0;
while ($i < 5) {
echo $i++; // 输出 0,1,2,3,4
}
3. do-while 循环
[*] 场景:至少执行一次(如用户输入验证)。
[*] 示例:
$i = 0;
do {
echo $i++; // 输出 0
} while ($i < 0); // 条件为假,但代码块已执行
4. foreach 循环
[*] 场景:遍历数组或对象(最常用)。
[*] 基础遍历:
$colors = ["红", "绿", "蓝"];
foreach ($colors as $color) {
echo $color; // 输出 红绿蓝
}
[*] 键值遍历:
$ages = ["Alice" => 25, "Bob" => 30];
foreach ($ages as $name => $age) {
echo "$name: $age"; // 输出 Alice:25, Bob:30
}
[*] 引用遍历(修改原数组):
$nums = ;
foreach ($nums as &$num) {
$num *= 2; // 修改原数组为
}
unset($num); // 必须 unset 避免后续误操作
三、循环控制语句
语句用途示例break立即退出当前循环break; 或 break 2;(退出两层)continue跳过当前迭代,进入下一次循环continue; 或 continue 2;
[*] 示例:
for ($i=0; $i<10; $i++) {
if ($i % 2 == 0) continue; // 跳过偶数
echo $i; // 输出 1,3,5,7,9
}
四、常见陷阱与办理方案
1. 无限循环
[*] 题目:循环条件永久为真。
while (true) {
// 缺少终止条件
}
[*] 办理:确保循环条件终极变为 false,或用 break 退出。
2. foreach 引用泄漏
[*] 题目:引用变量未释放导致意外修改。
$arr = ;
foreach ($arr as &$v) { ... }
foreach ($arr as $v) { ... } // 第二个循环会意外修改 $arr
[*] 办理:遍历后立即 unset($v)。
3. 循环变量作用域
[*] PHP 特性:循环变量在外部仍可访问。
for ($i=0; $i<5; $i++) { ... }
echo $i; // 输出 5(其他语言可能报错)
[*] 办理:必要时手动 unset($i)。
五、性能优化策略
[*]优先利用 foreach
[*]遍历数组时比 for 更高效(尤其对关联数组)。
[*]避免重复计算
[*]将 count()、strlen() 等函数结果预存。
[*]减少循环内部操作
[*]将复杂逻辑移出循环(如数据库查询、文件操作)。
六、更换语法(模板场景)
[*] for 更换语法:
<?php for ($i=0; $i<3; $i++): ?>
<div>第 <?= $i+1 ?> 项</div>
<?php endfor; ?>
[*] foreach 更换语法:
<?php foreach ($items as $item): ?>
<li><?= htmlspecialchars($item) ?></li>
<?php endforeach; ?>
七、最佳实践总结
场景推荐结构理由已知循环次数for直观控制初始化和步长遍历数组/对象foreach高效且无需手动管理索引条件满足时执行while恰当读取流数据或未知次数循环至少执行一次do-while确保代码块至少运行一次模板中混淆 HTML更换语法(for:)提升代码可读性 总结
PHP 的循环结构是处理重复使命的核心工具,合理选择循环类型、优化性能并规避陷阱,可以明显提升代码质量。关键要点:
[*]明白循环场景:选择 for、while 或 foreach。
[*]严酷管理引用:避免 foreach 引用泄漏。
[*]优化性能:减少循环内部计算,预存关键值。
六,循环控制
1. break 语句
[*] 作用:立即制止当前循环,跳出循环体。
[*] 扩展用法:break 可继承一个可选的数字参数(默认1),表示跳出多少层嵌套循环。
for ($i = 0; $i < 3; $i++) {
echo "外层循环: $i\n";
for ($j = 0; $j < 3; $j++) {
if ($j == 1) {
break 2; // 跳出两层循环
}
echo "内层循环: $j\n";
}
}
// 输出:
// 外层循环: 0
// 内层循环: 0
2. continue 语句
[*] 作用:跳过当前循环的剩余代码,进入下一次迭代。
[*] 扩展用法:continue 也可继承数字参数,表示跳过多少层循环的剩余代码。
for ($i = 0; $i < 3; $i++) {
echo "外层循环: $i\n";
for ($j = 0; $j < 3; $j++) {
if ($j == 1) {
continue 2; // 跳过两层循环的当前迭代
}
echo "内层循环: $j\n";
}
}
// 输出:
// 外层循环: 0
// 内层循环: 0
// 外层循环: 1
// 内层循环: 0
// 外层循环: 2
// 内层循环: 0
3. goto 语句
goto 操作符可以用来跳转到步伐中的另一位置。该目标位置可以用 区分巨细写 的目标名称加上冒号来标记,而跳转指令是 goto 之后接上目标位置的标记。PHP 中的 goto 有一定限制,目标位置只能位于同一个文件和作用域,也就是说无法跳出一个函数或类方法,也无法跳入到另一个函数。也无法跳入到任何循环或者 switch 结构中。可以跳出循环或者 switch,通常的用法是用 goto 代替多层的 break。
[*] 作用:无条件跳转到步伐中指定的标签位置。
[*] 限制:
[*]不能跳入循环或 switch 内部。
[*]不能跳出函数或类方法,也不能跨文件跳转。
goto start;
echo "这行不会执行"; // 被跳过
start:
echo "程序从此处开始执行\n";
for ($i = 0; $i < 5; $i++) {
if ($i == 3) {
goto end; // 跳出循环
}
echo $i;
}
end:
echo "\n循环提前结束。";
// 输出:0123循环提前结束。
关键留意事项
[*]参数范围:break 和 continue 的参数必须为大于即是1的整数。
[*]switch 中的 break:在 switch 结构中,break 用于制止 case 块,而非跳出循环。
[*]goto 的审慎利用:虽然 goto 可以简化某些逻辑(如错误处理),但过度利用会低落代码可读性。
语句作用参数支持典范场景break制止循环数字(默认1)提前退出循环continue跳过当前迭代数字(默认1)过滤特定条件的数据goto跳转到标签位置无错误处理或深层嵌套退出 合理利用这些语句能提升代码效率,但需留意避免滥用(尤其是goto),以确保代码清晰易维护。
七,流程控制更换语法
PHP 的流程控制结构(如 if、for、while、foreach)除了常规的用大括号 {} 包裹代码块的语法外,还提供了一种更换语法(Alternative Syntax)。这种语法利用冒号 : 代替左大括号 {,并用特定的结束标记(如 endif;、endfor; 等)代替右大括号 }。
更换语法的主要目的是提高代码在混淆 HTML 和 PHP 时的可读性,尤其是在模板文件中更常见。
常见的更换语法示例
1. if 语句
<?php if ($condition): ?>
<!-- HTML 内容 -->
<p>条件成立</p>
<?php endif; ?>
对比常规语法:
<?php if ($condition) { ?>
<p>条件成立</p>
<?php } ?>
2. if-else 语句
<?php if ($condition): ?>
<p>条件成立</p>
<?php else: ?>
<p>条件不成立</p>
<?php endif; ?>
3. elseif 语句
<?php if ($condition1): ?>
<p>条件1成立</p>
<?php elseif ($condition2): ?>
<p>条件2成立</p>
<?php else: ?>
<p>都不成立</p>
<?php endif; ?>
4. foreach 循环
<?php foreach ($array as $item): ?>
<p><?php echo $item; ?></p>
<?php endforeach; ?>
对比常规语法:
<?php foreach ($array as $item) { ?>
<p><?php echo $item; ?></p>
<?php } ?>
5. for 循环
<?php for ($i = 0; $i < 10; $i++): ?>
<p>数字:<?php echo $i; ?></p>
<?php endfor; ?>
6. while 循环
<?php while ($condition): ?>
<p>循环内容</p>
<?php endwhile; ?>
更换语法的特点
[*] 结束标记:
[*]if 结束于 endif;
[*]foreach 结束于 endforeach;
[*]for 结束于 endfor;
[*]while 结束于 endwhile;
[*]switch 结束于 endswitch;(switch 也可以利用更换语法)
[*] 恰当混淆 HTML:
更换语法在 HTML 模板中更直观,减少 {} 的视觉干扰。
[*] 必须严酷配对:
不能混用大括号和更换语法,例如以下代码是错误的:
<?php if ($condition): ?>
<p>内容</p>
<?php } ?><!-- 错误!必须用 endif; -->
适用场景
[*]视图模板文件(如 .phtml 或 .php 模板)中,更换语法可以让 HTML 和 PHP 代码更清晰。
[*]避免大量 echo:在输出 HTML 时,更换语法比频繁利用 echo 更简便。
更换语法通过 : 和明白的结束标记(如 endif)提升了代码可读性,尤其在混淆 HTML 的场景中。但需留意语法闭合的严酷性,避免混用两种语法风格。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]