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:退出switch
  • default:默认情况

2.2 执行流程 #

  1. 计算switch后的表达式
  2. 与每个case值比较(松散比较==)
  3. 匹配成功则执行对应代码块
  4. 遇到break退出
  5. 无匹配则执行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