switch语句 #
一、基本语法 #
php
<?php
$day = 1;
switch ($day) {
case 1:
echo "星期一";
break;
case 2:
echo "星期二";
break;
case 3:
echo "星期三";
break;
case 4:
echo "星期四";
break;
case 5:
echo "星期五";
break;
case 6:
echo "星期六";
break;
case 7:
echo "星期日";
break;
default:
echo "无效的日期";
}
二、switch 结构 #
2.1 组成部分 #
switch:开始switch语句case:定义匹配值break:退出switchdefault:默认情况
2.2 执行流程 #
- 计算switch后的表达式
- 与每个case值比较(松散比较==)
- 匹配成功则执行对应代码块
- 遇到break退出
- 无匹配则执行default
三、break 语句 #
3.1 break的作用 #
php
<?php
$number = 2;
switch ($number) {
case 1:
echo "一";
case 2:
echo "二";
case 3:
echo "三";
}
3.2 正确使用break #
php
<?php
$number = 2;
switch ($number) {
case 1:
echo "一";
break;
case 2:
echo "二";
break;
case 3:
echo "三";
break;
}
3.3 break层级 #
php
<?php
$i = 0;
while ($i < 3) {
switch ($i) {
case 0:
echo "零\n";
break 1;
case 1:
echo "一\n";
break 2;
case 2:
echo "二\n";
break;
}
$i++;
}
四、case 合并 #
4.1 多个case共享代码 #
php
<?php
$month = 2;
switch ($month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
echo "31天";
break;
case 4:
case 6:
case 9:
case 11:
echo "30天";
break;
case 2:
echo "28或29天";
break;
default:
echo "无效月份";
}
4.2 状态码处理 #
php
<?php
$status = 200;
switch ($status) {
case 200:
case 201:
case 204:
echo "成功";
break;
case 400:
case 401:
case 403:
echo "客户端错误";
break;
case 500:
case 502:
case 503:
echo "服务器错误";
break;
}
五、default 分支 #
5.1 基本用法 #
php
<?php
$color = "pink";
switch ($color) {
case "red":
echo "红色";
break;
case "green":
echo "绿色";
break;
case "blue":
echo "蓝色";
break;
default:
echo "未知颜色";
}
5.2 default位置 #
php
<?php
switch ($value) {
default:
echo "默认处理";
break;
case 1:
echo "情况1";
break;
}
六、替代语法 #
php
<?php
$type = 'admin';
switch ($type):
case 'admin':
echo "管理员";
break;
case 'user':
echo "普通用户";
break;
default:
echo "访客";
endswitch;
七、松散比较 #
7.1 类型转换 #
php
<?php
$value = "1";
switch ($value) {
case 1:
echo "匹配整数1";
break;
case "1":
echo "匹配字符串1";
break;
}
7.2 严格比较 #
php
<?php
$value = "1";
switch (true) {
case $value === 1:
echo "整数1";
break;
case $value === "1":
echo "字符串1";
break;
}
八、switch vs if-elseif #
8.1 使用switch的场景 #
php
<?php
$grade = 'B';
switch ($grade) {
case 'A':
echo "优秀";
break;
case 'B':
echo "良好";
break;
case 'C':
echo "及格";
break;
default:
echo "不及格";
}
8.2 使用if-elseif的场景 #
php
<?php
$score = 85;
if ($score >= 90) {
echo "优秀";
} elseif ($score >= 80) {
echo "良好";
} elseif ($score >= 70) {
echo "中等";
} else {
echo "及格";
}
九、match 表达式(PHP 8.0+) #
9.1 match基本语法 #
php
<?php
$status = 200;
$message = match($status) {
200 => "OK",
400 => "Bad Request",
404 => "Not Found",
500 => "Internal Server Error",
default => "Unknown"
};
echo $message;
9.2 match vs switch #
| 特性 | switch | match |
|---|---|---|
| 比较 | 松散(==) | 严格(===) |
| 返回值 | 无 | 有 |
| 穿透 | 支持 | 不支持 |
| 异常 | 无 | UnhandledMatchError |
9.3 严格比较 #
php
<?php
$value = "1";
$result = match($value) {
1 => "整数1",
"1" => "字符串1",
default => "其他"
};
echo $result;
9.4 多条件匹配 #
php
<?php
$grade = 'B';
$result = match($grade) {
'A', 'B' => "优秀",
'C', 'D' => "及格",
'F' => "不及格",
default => "无效成绩"
};
9.5 表达式匹配 #
php
<?php
$age = 25;
$category = match(true) {
$age < 13 => "儿童",
$age < 18 => "青少年",
$age < 60 => "成年人",
default => "老年人"
};
十、实际应用 #
10.1 路由处理 #
php
<?php
$action = $_GET['action'] ?? 'index';
switch ($action) {
case 'index':
include 'controllers/index.php';
break;
case 'show':
include 'controllers/show.php';
break;
case 'create':
include 'controllers/create.php';
break;
case 'update':
include 'controllers/update.php';
break;
case 'delete':
include 'controllers/delete.php';
break;
default:
http_response_code(404);
echo "页面不存在";
}
10.2 内容类型处理 #
php
<?php
$contentType = $_SERVER['CONTENT_TYPE'] ?? '';
switch ($contentType) {
case 'application/json':
$data = json_decode(file_get_contents('php://input'), true);
break;
case 'application/x-www-form-urlencoded':
$data = $_POST;
break;
case 'multipart/form-data':
$data = $_POST + $_FILES;
break;
default:
$data = [];
}
10.3 状态机 #
php
<?php
enum OrderStatus: string
{
case Pending = 'pending';
case Processing = 'processing';
case Shipped = 'shipped';
case Delivered = 'delivered';
case Cancelled = 'cancelled';
}
function processOrder(OrderStatus $status): string
{
return match($status) {
OrderStatus::Pending => "等待处理",
OrderStatus::Processing => "处理中",
OrderStatus::Shipped => "已发货",
OrderStatus::Delivered => "已送达",
OrderStatus::Cancelled => "已取消",
};
}
十一、最佳实践 #
11.1 使用match替代简单switch #
php
<?php
$message = match($code) {
200 => "成功",
400 => "请求错误",
404 => "未找到",
500 => "服务器错误",
default => "未知错误"
};
11.2 不要忘记break #
php
<?php
switch ($value) {
case 1:
doSomething();
break;
case 2:
doOther();
break;
}
11.3 总是添加default #
php
<?php
switch ($type) {
case 'a':
handleA();
break;
case 'b':
handleB();
break;
default:
handleDefault();
}
11.4 使用枚举(PHP 8.1+) #
php
<?php
enum Status: int
{
case Pending = 0;
case Active = 1;
case Inactive = 2;
}
function getStatusMessage(Status $status): string
{
return match($status) {
Status::Pending => "待处理",
Status::Active => "激活",
Status::Inactive => "未激活",
};
}
十二、总结 #
本章学习了:
- switch基本语法
- break和穿透特性
- case合并
- 松散比较
- match表达式(PHP 8.0+)
- 最佳实践
下一章将学习循环语句。
最后更新:2026-03-26