PHP8 条件语句:控制程序流程的核心逻辑
条件语句是编程中用于根据不同情况执行不同代码块的基础结构。PHP8 提供了丰富的条件控制语法,包括 if 语句、switch 语句,以及新增的 match 表达式,它们各自适用于不同的场景。本文将详细讲解这些条件语句的语法、特性、使用场景及最佳实践。
if 语句:最基础的条件判断
if 语句是最常用的条件判断结构,用于根据一个或多个条件的真假执行相应代码块。
1. 基础语法
1 |
|
2. 关键特性
条件表达式:必须返回布尔值(
true或false),PHP 会自动将非布尔值转换为布尔值(如0、""、null转为false,非零数值、非空字符串转为true)。代码块简化:若代码块仅包含一条语句,可省略大括号{}(但建议始终保留,提升可读性):
1
2
3
4
5
$score = 85;
if ($score >= 60) echo "及格"; // 单行可省略大括号
else echo "不及格";多条件组合:可通过逻辑运算符(&&与、||或、!非)组合多个条件:
1
2
3
4
5
6
7
8
$age = 20;
$hasId = true;
// 年龄大于18且有身份证,才能进入
if ($age >= 18 && $hasId) {
echo "允许进入";
}
3. PHP8 增强:更严格的类型判断
PHP8 对条件表达式中的类型转换更加严格,特别是在使用 ===(全等)时,避免了意外的类型转换:
1 |
|
4. 实战示例:成绩评级
1 |
|
switch 语句:多值匹配的高效选择
当需要根据一个变量的多个可能值执行不同代码块时,switch 语句比 if...elseif 更简洁、高效。
1. 基础语法
1 |
|
2. 关键特性
比较规则:switch中使用==(宽松比较)而非===(严格比较),会自动进行类型转换:
1
2
3
4
5
6
7
8
9
10
11
$num = "5";
switch ($num) {
case 5: // "5" == 5 为 true,会匹配此 case
echo "匹配成功";
break;
default:
echo "不匹配";
}
// 输出:匹配成功break 语句:必须使用break结束每个case,否则会继续执行下一个case(称为 “穿透” 现象):
1
2
3
4
5
6
7
8
9
10
11
12
13
$day = 2;
switch ($day) {
case 1:
echo "周一";
case 2:
echo "周二"; // 会执行
case 3:
echo "周三"; // 也会执行(因 case 2 无 break)
break;
}
// 输出:周二周三default 子句:可选,当所有
case都不匹配时执行,通常放在最后(无需break)。
3. PHP8 增强:允许表达式作为 case 值
PHP8 之前,case 后只能跟常量值;PHP8 允许使用表达式作为 case 的值:
1 |
|
4. 实战示例:根据星期几输出活动
1 |
|
match 表达式:PHP8 新增的现代匹配语法
PHP8 引入了 match 表达式,它是 switch 的增强版,更简洁、安全,支持返回值,适合需要根据匹配结果返回不同值的场景。
1. 基础语法
1 |
|
2. 与 switch 的核心区别
| 特性 | switch 语句 | match 表达式 |
|---|---|---|
| 比较方式 | 宽松比较(==) |
严格比较(===,类型和值都需匹配) |
| 返回值 | 无返回值,需手动赋值 | 有返回值,可直接赋值给变量 |
| 穿透现象 | 需用 break 避免穿透 |
自动避免穿透,无需 break |
| 匹配项类型 | 仅支持常量(PHP8 前) | 支持常量、表达式、数组等 |
| 代码块 | 支持多行代码块 | 右侧为表达式(单行,复杂逻辑需用匿名函数) |
3. 关键特性
严格比较:
match使用===比较,类型必须一致:1
2
3
4
5
6
7
8
9
$num = "5";
$result = match ($num) {
5 => "数字5", // "5" === 5 为 false,不匹配
"5" => "字符串5", // 匹配
default => "不匹配"
};
echo $result; // 输出:字符串5多值匹配:用逗号
,分隔多个值,匹配其中任何一个即可:1
2
3
4
5
6
7
8
9
$day = "周六";
$result = match ($day) {
"周六", "周日" => "休息日", // 匹配周六或周日
"周一", "周二", "周三", "周四", "周五" => "工作日",
default => "无效日期"
};
echo $result; // 输出:休息日返回值:
match是表达式,可直接返回结果,简化赋值逻辑:1
2
3
4
5
6
7
8
9
10
$score = 75;
$grade = match (true) {
$score >= 90 => "优秀",
$score >= 80 => "良好",
$score >= 60 => "及格",
default => "不及格"
};
echo $grade; // 输出:及格支持表达式匹配:
case右侧可以是任意表达式:1
2
3
4
5
6
7
8
9
10
$age = 20;
$status = match (true) {
$age < 18 => "未成年",
$age >= 18 && $age < 60 => "成年",
$age >= 60 => "老年",
default => "未知"
};
echo $status; // 输出:成年
4. 实战示例:API 接口状态码处理
1 |
|
条件语句的选择指南
| 场景 | 推荐使用 | 原因分析 |
|---|---|---|
| 简单的真假判断 | if 语句 | 语法简洁,适合单一条件 |
| 多个互斥条件(2-3 个) | if…elseif | 逻辑清晰,无需记忆 break 或严格比较规则 |
| 多个固定值匹配(4 个以上) | switch 语句 | 比 if…elseif 更简洁,执行效率更高 |
| 需要返回匹配结果,或严格比较 | match 表达式 | 自动返回值,严格比较更安全,PHP8+ 推荐 |
| 处理状态码、枚举值等 | match 表达式 | 多值匹配语法简洁,避免穿透错误 |
常见错误与最佳实践
1. 避免在条件中使用赋值运算符(=)
错误地用 =(赋值)代替 ==(比较)是常见错误:
1 |
|
2. 始终使用大括号包裹代码块
即使代码块只有一行,也建议保留大括号,避免后续添加代码时出错:
1 |
|
3. 优先使用 === 进行严格比较
避免因类型转换导致的意外结果:
1 |
|
总结
PHP8 提供了 if、switch 和 match 三种条件控制结构,各自适用于不同场景:
if语句:最灵活,适合简单条件或少量分支判断;switch语句:适合多固定值匹配,注意用break避免穿透;match表达式(PHP8+):现代、安全的匹配语法,支持严格比较和返回值,推荐优先使用
v1.3.10