Skip to content

PHP Switch

switch 语句提供了一种根据单个表达式的值执行不同代码块的方式。它通常用作一系列 if...elseif...else 语句的替代方案。

使用 switch 语句根据比较结果选择执行多个代码块中的一个。

switch (expression) {
case value1:
// 如果 expression == value1 执行的代码
break; // 退出 switch 语句
case value2:
// 如果 expression == value2 执行的代码
break;
case value3:
// 如果 expression == value3 执行的代码
break;
// ... 更多 case
default:
// 如果 expression 不匹配以上任何 case 执行的代码
}
  1. expression(通常是一个变量)会被评估一次。
  2. expression 的值会与每个 case 语句中指定的值进行比较。
  3. 重要: 比较是宽松的 (==),这意味着可能会发生类型转换(例如,0 == 'a' 为 true)。
  4. 如果找到匹配项,则执行与该 case 相关联的代码块。
  5. break 语句至关重要。它会停止 switch 块内部的执行。如果没有 break,即使值不匹配,执行也会“穿透”到下一个 case 块。
  6. 可选的 default case 在没有任何 case 值匹配 expression 时执行。
<?php
$favcolor = "red";
switch ($favcolor) {
case "red":
echo "你最喜欢的颜色是红色!";
break; // 在此停止执行
case "blue":
echo "你最喜欢的颜色是蓝色!";
break;
case "green":
echo "你最喜欢的颜色是绿色!";
break;
default:
echo "你最喜欢的颜色既不是红色、蓝色,也不是绿色!";
}
// 输出: 你最喜欢的颜色是红色!
echo "<br>";
$day = "Monday";
switch ($day) {
case "Saturday":
case "Sunday":
echo "是周末啦!";
break; // 检查周末后退出
case "Monday":
echo "工作周开始.";
// 这里没有 break - 演示穿透
case "Tuesday":
case "Wednesday":
case "Thursday":
echo " 还在工作中..."; // 如果今天是 Monday,这也会执行
break;
case "Friday":
echo "快周末啦!";
break;
default:
echo "无效日期.";
}
// 输出: 工作周开始. 还在工作中...
?>

PHP 8 match 表达式(现代替代方案)

Section titled “PHP 8 match 表达式(现代替代方案)”

PHP 8.0 引入了 match 表达式,它通常是 switch 更简洁、更安全的替代方案:

  • 严格比较: 使用严格比较 (===),避免意外的类型转换问题。
  • 基于表达式: match 是一个表达式,这意味着它可以返回一个值,可以赋给变量或直接使用。
  • 无穿透: 不需要 break 语句;只执行第一个匹配分支对应的代码。
  • 需要穷尽所有 case(或 default): 如果表达式不匹配任何分支且没有 default,则会抛出 UnhandledMatchError。
  • 允许多个条件: 条件可以用逗号分隔。

match 示例(与颜色示例等效):

Section titled “match 示例(与颜色示例等效):”
<?php
$favcolor = "red";
$message = match ($favcolor) {
"red" => "你最喜欢的颜色是红色!",
"blue" => "你最喜欢的颜色是蓝色!",
"green" => "你最喜欢的颜色是绿色!",
default => "你最喜欢的颜色既不是红色、蓝色,也不是绿色!",
};
echo $message;
// 输出: 你最喜欢的颜色是红色!
?>

switch 语句仍然有用,但在 PHP 8+ 中,当您需要严格比较和返回值时,考虑使用 match 来获得更清晰、更安全的条件逻辑。