PHP 条件语句:if/else/elseif/switch 及 match 表达式
条件语句基础
条件语句让程序根据不同情况做出不同响应,是所有编程语言的核心结构。
一、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; ?>
规则:if → endif,elseif → elseif:,} → :
三、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更易读