0%

PHP8 条件语句:控制程序流程的核心逻辑

PHP8 条件语句:控制程序流程的核心逻辑

条件语句是编程中用于根据不同情况执行不同代码块的基础结构。PHP8 提供了丰富的条件控制语法,包括 if 语句、switch 语句,以及新增的 match 表达式,它们各自适用于不同的场景。本文将详细讲解这些条件语句的语法、特性、使用场景及最佳实践。

if 语句:最基础的条件判断

if 语句是最常用的条件判断结构,用于根据一个或多个条件的真假执行相应代码块。

1. 基础语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
// 单条件判断
if (条件表达式) {
// 条件为 true 时执行的代码
}

// if...else 结构(二选一)
if (条件表达式) {
// 条件为 true 时执行
} else {
// 条件为 false 时执行
}

// if...elseif...else 结构(多条件分支)
if (条件1) {
// 条件1 为 true 时执行
} elseif (条件2) {
// 条件1 为 false 且条件2 为 true 时执行
} else {
// 所有条件都为 false 时执行
}
?>

2. 关键特性

  • 条件表达式:必须返回布尔值(truefalse),PHP 会自动将非布尔值转换为布尔值(如 0""null 转为 false,非零数值、非空字符串转为 true)。

  • 代码块简化:若代码块仅包含一条语句,可省略大括号{}(但建议始终保留,提升可读性):

    1
    2
    3
    4
    5
    <?php
    $score = 85;
    if ($score >= 60) echo "及格"; // 单行可省略大括号
    else echo "不及格";
    ?>
  • 多条件组合:可通过逻辑运算符(&&与、||或、!非)组合多个条件:

    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $age = 20;
    $hasId = true;
    // 年龄大于18且有身份证,才能进入
    if ($age >= 18 && $hasId) {
    echo "允许进入";
    }
    ?>

3. PHP8 增强:更严格的类型判断

PHP8 对条件表达式中的类型转换更加严格,特别是在使用 ===(全等)时,避免了意外的类型转换:

1
2
3
4
5
6
<?php
// PHP8 中,字符串 "0" 与数字 0 的比较
var_dump("0" == 0); // bool(true) 宽松比较,允许类型转换
var_dump("0" === 0); // bool(false) 严格比较,类型不同则为 false

?>

4. 实战示例:成绩评级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$score = 85;

if ($score >= 90) {
$grade = "优秀";
} elseif ($score >= 80) {
$grade = "良好";
} elseif ($score >= 60) {
$grade = "及格";
} else {
$grade = "不及格";
}

echo "成绩评级:{$grade}"; // 输出:成绩评级:良好
?>

switch 语句:多值匹配的高效选择

当需要根据一个变量的多个可能值执行不同代码块时,switch 语句比 if...elseif 更简洁、高效。

1. 基础语法

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
switch (变量/表达式) {
case1:
// 变量等于值1时执行
break; // 跳出 switch 语句
case2:
// 变量等于值2时执行
break;
// ... 更多 case
default:
// 所有 case 都不匹配时执行(可选)
}
?>

2. 关键特性

  • 比较规则:switch中使用==(宽松比较)而非===(严格比较),会自动进行类型转换:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    $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
    <?php
    $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
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$score = 85;
switch (true) { // 技巧:用 true 作为判断基准
case $score >= 90:
echo "优秀";
break;
case $score >= 80:
echo "良好";
break;
// ...
}
// 输出:良好
?>

4. 实战示例:根据星期几输出活动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$weekday = date("N"); // 获取当前星期几(1=周一,7=周日)

switch ($weekday) {
case 1:
case 2: // 周一和周二共用同一逻辑(穿透特性)
echo "今日活动:编程学习";
break;
case 3:
echo "今日活动:技术分享";
break;
case 6:
case 7: // 周六和周日
echo "今日活动:休息";
break;
default: // 周四、周五
echo "今日活动:项目开发";
}
?>

match 表达式:PHP8 新增的现代匹配语法

PHP8 引入了 match 表达式,它是 switch 的增强版,更简洁、安全,支持返回值,适合需要根据匹配结果返回不同值的场景。

1. 基础语法

1
2
3
4
5
6
7
8
<?php
$result = match (变量/表达式) {
1 => 表达式1, // 变量等于值1时,返回表达式1的结果
2 => 表达式2,
// ... 更多匹配项
default => 默认表达式, // 所有值都不匹配时返回
};
?>

2. 与 switch 的核心区别

特性 switch 语句 match 表达式
比较方式 宽松比较(== 严格比较(===,类型和值都需匹配)
返回值 无返回值,需手动赋值 有返回值,可直接赋值给变量
穿透现象 需用 break 避免穿透 自动避免穿透,无需 break
匹配项类型 仅支持常量(PHP8 前) 支持常量、表达式、数组等
代码块 支持多行代码块 右侧为表达式(单行,复杂逻辑需用匿名函数)

3. 关键特性

  • 严格比较match 使用 === 比较,类型必须一致:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    $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
    <?php
    $day = "周六";
    $result = match ($day) {
    "周六", "周日" => "休息日", // 匹配周六或周日
    "周一", "周二", "周三", "周四", "周五" => "工作日",
    default => "无效日期"
    };
    echo $result; // 输出:休息日
    ?>
  • 返回值match 是表达式,可直接返回结果,简化赋值逻辑:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    $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
    <?php
    $age = 20;
    $status = match (true) {
    $age < 18 => "未成年",
    $age >= 18 && $age < 60 => "成年",
    $age >= 60 => "老年",
    default => "未知"
    };
    echo $status; // 输出:成年
    ?>

4. 实战示例:API 接口状态码处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$statusCode = 404;

$message = match ($statusCode) {
200 => "请求成功",
400 => "无效请求",
401 => "未授权",
403 => "禁止访问",
404 => "资源不存在",
500 => "服务器错误",
default => "未知状态码: {$statusCode}"
};

echo "状态描述:{$message}"; // 输出:状态描述:资源不存在
?>

条件语句的选择指南

场景 推荐使用 原因分析
简单的真假判断 if 语句 语法简洁,适合单一条件
多个互斥条件(2-3 个) if…elseif 逻辑清晰,无需记忆 break 或严格比较规则
多个固定值匹配(4 个以上) switch 语句 比 if…elseif 更简洁,执行效率更高
需要返回匹配结果,或严格比较 match 表达式 自动返回值,严格比较更安全,PHP8+ 推荐
处理状态码、枚举值等 match 表达式 多值匹配语法简洁,避免穿透错误

常见错误与最佳实践

1. 避免在条件中使用赋值运算符(=)

错误地用 =(赋值)代替 ==(比较)是常见错误:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$a = 5;
// 错误:if 中使用 = 会先赋值再判断($a=10 始终为 true)
if ($a = 10) {
echo "永远会执行";
}

// 正确:使用 == 或 === 比较
if ($a == 10) {
echo "仅当 \$a 等于10时执行";
}
?>

2. 始终使用大括号包裹代码块

即使代码块只有一行,也建议保留大括号,避免后续添加代码时出错:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
// 不推荐:无大括号,添加第二行代码时会执行错误
if ($score > 60)
echo "及格";
echo "继续努力"; // 这行代码始终会执行,与 if 无关

// 推荐:用大括号明确代码块范围
if ($score > 60) {
echo "及格";
echo "继续努力"; // 仅当条件成立时执行
}
?>

3. 优先使用 === 进行严格比较

避免因类型转换导致的意外结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$value = "0";
// 风险:宽松比较,"0" == false 为 true
if ($value == false) {
echo "错误判断:'0' 被当作 false";
}

// 安全:严格比较,类型不同则不匹配
if ($value === false) {
echo "正确:仅当 \$value 是 false 时执行";
} else {
echo "正确执行:'0' 不是 false";
}
?>

总结

PHP8 提供了 ifswitchmatch 三种条件控制结构,各自适用于不同场景:

  • if 语句:最灵活,适合简单条件或少量分支判断;
  • switch 语句:适合多固定值匹配,注意用 break 避免穿透;
  • match 表达式(PHP8+):现代、安全的匹配语法,支持严格比较和返回值,推荐优先使用

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10