Switch 语句是 PHP 中用于多条件分支控制的重要结构,它可以根据不同的条件值执行不同的代码块,是替代复杂 if-elseif 语句的理想选择。
Switch 语句用于基于不同条件执行不同的动作。当需要检查一个变量或表达式与多个可能值的匹配情况时,使用 switch 语句可以使代码更加清晰和易读。
Switch 语句的基本语法结构如下:
switch (expression) {
case value1:
// 代码块1
break;
case value2:
// 代码块2
break;
case value3:
// 代码块3
break;
default:
// 默认代码块
}
<?php
$day = "Monday";
switch ($day) {
case "Monday":
echo "今天是星期一";
break;
case "Tuesday":
echo "今天是星期二";
break;
case "Wednesday":
echo "今天是星期三";
break;
case "Thursday":
echo "今天是星期四";
break;
case "Friday":
echo "今天是星期五";
break;
case "Saturday":
echo "今天是星期六";
break;
case "Sunday":
echo "今天是星期日";
break;
default:
echo "未知的日期";
}
?>
<?php
$score = 85;
switch (true) {
case ($score >= 90):
echo "成绩优秀";
break;
case ($score >= 80):
echo "成绩良好";
break;
case ($score >= 70):
echo "成绩中等";
break;
case ($score >= 60):
echo "成绩及格";
break;
default:
echo "成绩不及格";
}
?>
break 语句用于阻止代码自动执行到下一个 case。如果省略 break,代码会继续执行后续的 case,直到遇到 break 或 switch 结束。
<?php
// 有 break 的情况
$fruit = "apple";
switch ($fruit) {
case "apple":
echo "这是苹果";
break;
case "banana":
echo "这是香蕉";
break;
case "orange":
echo "这是橙子";
break;
}
// 输出: 这是苹果
echo "<br>";
// 没有 break 的情况(穿透现象)
$number = 1;
switch ($number) {
case 1:
echo "数字1";
case 2:
echo "数字2";
case 3:
echo "数字3";
default:
echo "其他数字";
}
// 输出: 数字1数字2数字3其他数字
?>
<?php
$month = 2;
switch ($month) {
case 12:
case 1:
case 2:
echo "冬季";
break;
case 3:
case 4:
case 5:
echo "春季";
break;
case 6:
case 7:
case 8:
echo "夏季";
break;
case 9:
case 10:
case 11:
echo "秋季";
break;
default:
echo "无效的月份";
}
// 输出: 冬季
?>
Switch 语句使用松散比较(==),这意味着类型转换会发生:
<?php
$value = "1";
switch ($value) {
case 1:
echo "匹配数字 1";
break;
case "1":
echo "匹配字符串 '1'";
break;
default:
echo "没有匹配";
}
// 输出: 匹配数字 1(因为松散比较 "1" == 1 为 true)
?>
<?php
$userRole = "admin";
switch ($userRole) {
case "super_admin":
echo "显示所有管理功能";
echo "<br>可以管理用户";
echo "<br>可以修改系统设置";
break;
case "admin":
echo "显示管理功能";
echo "<br>可以管理内容";
echo "<br>可以审核用户";
break;
case "editor":
echo "显示编辑功能";
echo "<br>可以创建和编辑内容";
break;
case "user":
echo "显示用户功能";
echo "<br>可以浏览内容";
echo "<br>可以发表评论";
break;
default:
echo "显示游客功能";
echo "<br>只能浏览公开内容";
}
?>
<?php
$orderStatus = "shipped";
switch ($orderStatus) {
case "pending":
echo "订单待处理";
echo "<br>显示取消订单按钮";
break;
case "confirmed":
echo "订单已确认";
echo "<br>显示支付信息";
break;
case "paid":
echo "订单已支付";
echo "<br>准备发货";
break;
case "shipped":
echo "订单已发货";
echo "<br>显示物流信息";
echo "<br>显示确认收货按钮";
break;
case "completed":
echo "订单已完成";
echo "<br>显示评价按钮";
break;
case "cancelled":
echo "订单已取消";
echo "<br>显示重新订购按钮";
break;
default:
echo "未知订单状态";
}
?>
<?php
$language = "zh";
switch ($language) {
case "en":
$welcome = "Welcome to our website!";
$description = "This is an example website.";
break;
case "zh":
$welcome = "欢迎访问我们的网站!";
$description = "这是一个示例网站。";
break;
case "ja":
$welcome = "私たちのウェブサイトへようこそ!";
$description = "これはサンプルウェブサイトです。";
break;
case "es":
$welcome = "¡Bienvenido a nuestro sitio web!";
$description = "Este es un sitio web de ejemplo.";
break;
default:
$welcome = "Welcome!";
$description = "This is an example website.";
}
echo "<h1>" . $welcome . "</h1>";
echo "<p>" . $description . "</p>";
?>
| 特性 | Switch 语句 | If-Else 语句 |
|---|---|---|
| 适用场景 | 单一变量与多个固定值比较 | 复杂条件判断、范围判断 |
| 可读性 | 结构清晰,易于阅读 | 条件复杂时可能难以阅读 |
| 性能 | 通常更快(使用跳转表) | 需要逐个条件判断 |
| 比较方式 | 松散比较(==) | 可自由选择比较方式 |
| 灵活性 | 相对固定 | 非常灵活 |
<?php
$color = "red";
// 使用 switch 实现
switch ($color) {
case "red":
$message = "停止";
break;
case "yellow":
$message = "准备";
break;
case "green":
$message = "通行";
break;
default:
$message = "未知信号";
}
// 使用 if-else 实现
if ($color == "red") {
$message2 = "停止";
} elseif ($color == "yellow") {
$message2 = "准备";
} elseif ($color == "green") {
$message2 = "通行";
} else {
$message2 = "未知信号";
}
echo "Switch 结果: " . $message . "<br>";
echo "If-Else 结果: " . $message2;
?>
PHP 8 引入了 match 表达式,它是 switch 语句的更强大、更简洁的替代品。
<?php
// 传统的 switch 语句
$statusCode = 404;
switch ($statusCode) {
case 200:
$message = "OK";
break;
case 301:
$message = "Moved Permanently";
break;
case 404:
$message = "Not Found";
break;
case 500:
$message = "Internal Server Error";
break;
default:
$message = "Unknown Status";
}
// PHP 8 match 表达式
$message = match($statusCode) {
200 => "OK",
301 => "Moved Permanently",
404 => "Not Found",
500 => "Internal Server Error",
default => "Unknown Status"
};
echo "状态消息: " . $message;
?>
<?php
// 多个条件匹配同一个结果
$age = 25;
$category = match(true) {
$age < 13 => "儿童",
$age >= 13 && $age < 20 => "青少年",
$age >= 20 && $age < 65 => "成人",
$age >= 65 => "老年人"
};
echo "年龄分类: " . $category . "<br>";
// 在函数中使用 match
function getDiscount($userType) {
return match($userType) {
'vip' => 0.3,
'premium' => 0.2,
'regular' => 0.1,
default => 0
};
}
echo "VIP 用户折扣: " . (getDiscount('vip') * 100) . "%<br>";
?>
<?php
// 推荐的写法 - 清晰的结构
function processUserAction($action) {
switch ($action) {
case 'login':
return performLogin();
case 'register':
return performRegistration();
case 'logout':
return performLogout();
case 'profile':
return showUserProfile();
default:
return showError("未知操作");
}
}
// 避免的写法 - 过于复杂的 case
function badExample($value) {
switch ($value) {
case 1:
// 大量复杂的代码
doSomething();
doAnotherThing();
calculateSomething();
// ... 更多代码
break;
// 其他 case...
}
// 更好的方式:将复杂逻辑提取到函数中
switch ($value) {
case 1:
return handleCaseOne();
// 其他 case...
}
}
?>
<?php
// 错误1: 忘记 break(除非有意为之)
$value = 1;
switch ($value) {
case 1:
echo "值1";
// 忘记 break,会继续执行 case 2
case 2:
echo "值2";
break;
}
// 输出: 值1值2
echo "<br>";
// 错误2: 使用复杂表达式(应使用 if-else)
$score = 85;
// 不推荐在 case 中使用复杂表达式
switch (true) {
case ($score >= 90 && $score <= 100):
echo "优秀";
break;
// 更好的方式是使用 if-elseif
}
// 错误3: 忽略 default 情况
$status = "unknown";
switch ($status) {
case "active":
echo "活跃";
break;
case "inactive":
echo "非活跃";
break;
// 没有 default,如果 $status 是 "unknown" 则没有输出
}
?>
break 防止代码穿透到下一个 case