PHP 条件语句:if/else/elseif/switch 及 match 表达式

小飞兽 PHP 12 次阅读 2026-07-16

条件语句基础

条件语句让程序根据不同情况做出不同响应,是所有编程语言的核心结构。

一、if 语句

基本写法

<?php\n$age = 20;\n\nif ($age >= 18) {\n    echo "已成年,可以进入";\n}\n?>

if-else

<?php\n$score = 72;\n\nif ($score >= 60) {\n    echo "及格";\n} else {\n    echo "不及格,需要补考";\n}\n?>

if-elseif-else

<?php\n$score = 85;\n\nif ($score >= 90) {\n    echo "优秀";\n} elseif ($score >= 80) {\n    echo "良好";\n} elseif ($score >= 60) {\n    echo "及格";\n} else {\n    echo "不及格";\n}\n?>

二、替代语法(模板中使用)

在 HTML 模板中,PHP 提供了一种不用大括号的替代语法:

<?php $type = 'success'; ?>\n\n<?php if ($type === 'success'): ?>\n    <div class="alert alert-success">操作成功</div>\n<?php elseif ($type === 'error'): ?>\n    <div class="alert alert-error">操作失败</div>\n<?php else: ?>\n    <div class="alert">未知状态</div>\n<?php endif; ?>

规则:ifendifelseifelseif:}:

三、switch 语句

当需要匹配同一个变量的多个值时,switch 比 if-elseif 更清晰:

<?php\n$day = date('N');  // 1-7(周一到周日)\n\nswitch ($day) {\n    case 1:\n        echo "今天是周一,新的一周开始了";\n        break;\n    case 2:\n    case 3:\n    case 4:\n    case 5:\n        echo "工作日,继续加油";\n        break;\n    case 6:\n        echo "周六,可以休息一下";\n        break;\n    case 7:\n        echo "周日,好好休息";\n        break;\n    default:\n        echo "未知日期";\n}\n?>

switch 的细节

<?php\n// switch 比较的是"松散比较"(==),不是严格比较(===)\n$var = "5";\nswitch ($var) {\n    case 5:\n        echo "匹配了 5";    // 会执行!因为 "5" == 5\n        break;\n}\n\n// 注意 break,否则会"穿透"\nswitch (2) {\n    case 1:\n        echo "case 1";\n        break;    // 去掉 break 会继续执行 case 2\n    case 2:\n        echo "case 2";\n        // 没有 break,继续穿透\n    case 3:\n        echo "case 3";\n        break;\n    // 输出:case 2case 3(穿透执行了 case 3)\n}\n?>

四、match 表达式(PHP 8+)

match 是 switch 的现代化替代品,返回值更简洁:

<?php\n$status = 'active';\n\n// match 表达式\n$label = match($status) {\n    'active'   => '活跃',\n    'inactive' => '未激活',\n    'banned'   => '已封禁',\n    default    => '未知状态',\n};\necho $label;  // 活跃\n?>

多值匹配

<?php\n$day = date('N');\n\n$type = match($day) {\n    1 => '周一',\n    2, 3, 4, 5 => '工作日',\n    6, 7 => '周末',\n};\necho $type;\n?>

条件匹配

<?php\n$score = 85;\n\n$grade = match(true) {\n    $score >= 90 => 'A',\n    $score >= 80 => 'B',\n    $score >= 60 => 'C',\n    default      => 'D',\n};\necho $grade;  // B\n?>

五、条件嵌套

<?php\n$is_logged_in = true;\n$role = 'admin';\n$content = '这是敏感内容';\n\nif ($is_logged_in) {\n    if ($role === 'admin' || $role === 'editor') {\n        echo $content;\n    } else {\n        echo "您没有权限查看此内容";\n    }\n} else {\n    echo "请先登录";\n}\n\n// 等价写法(用逻辑运算符,更简洁)\nif (!$is_logged_in) {\n    echo "请先登录";\n} elseif ($role !== 'admin' && $role !== 'editor') {\n    echo "您没有权限查看此内容";\n} else {\n    echo $content;\n}\n?>

六、常见技巧

简写:省略大括号(适用于单行语句)

<?php\nif ($is_valid) echo "有效";\n\n// 但不推荐,省略大括号容易出错\nif ($is_valid)\n    echo "有效";\n    echo "这行不属于 if!" // 容易出错\n?>

三元运算符替代简单 if-else

<?php\n// 简单判断用三元更简洁\n$status = $is_active ? "在线" : "离线";\n$name = $_GET['name'] ?? '匿名';\n$level = $user['level'] ?? 1;\n?>

使用 match 替代复杂 if-else

<?php\n$country = 'CN';\n\n// if-else 写法\nif ($country === 'CN') {\n    $lang = '中文';\n} elseif ($country === 'US' || $country === 'UK') {\n    $lang = 'English';\n} elseif ($country === 'JP') {\n    $lang = '日本語';\n} else {\n    $lang = '其他';\n}\n\n// match 写法(PHP 8+)\n$lang = match($country) {\n    'CN'       => '中文',\n    'US', 'UK' => 'English',\n    'JP'       => '日本語',\n    default    => '其他',\n};\n?>

总结

    • if/else/elseif 用于范围判断,switch/match 用于固定值匹配
    • switch 用 ==(松散比较),要注意类型
    • match(PHP 8+)比 switch 更简洁,能返回值
  • 条件嵌套不要太深(超过3层考虑重构)
  • 模板中用替代语法 if ... endif 更易读