switch
(PHP 4, PHP 5, PHP 7, PHP 8)
switch 語句類似於對同一個表達式進行的一系列 IF 語句。在許多情況下,您可能希望將同一個變數(或表達式)與許多不同的值進行比較,並根據它等於哪個值執行不同的程式碼片段。這正是 switch 語句的用途。
注意:請注意,與其他一些語言不同,continue 語句適用於 switch,並且行為類似於 break。如果您在迴圈內有 switch,並希望繼續到外部迴圈的下一次迭代,請使用 continue 2。
注意:
請注意,switch/case 執行的是寬鬆比較。
在以下範例中,每個程式碼區塊都是等效的。一個使用一系列 if 和 elseif 語句,另一個使用 switch 語句。在每種情況下,輸出都相同。
範例 #1 switch 結構
<?php
// 這個 switch 語句:
switch ($i) {
case 0:
echo "i 等於 0";
break;
case 1:
echo "i 等於 1";
break;
case 2:
echo "i 等於 2";
break;
}
// 等同於:
if ($i == 0) {
echo "i 等於 0";
} elseif ($i == 1) {
echo "i 等於 1";
} elseif ($i == 2) {
echo "i 等於 2";
}
?>
為了避免錯誤,理解 switch 語句的執行方式非常重要。switch 語句逐行執行(實際上是逐個語句執行)。一開始,不會執行任何程式碼。只有在找到一個 case 語句,其表達式求值結果與 switch 表達式的值相符時,PHP 才開始執行語句。PHP 會繼續執行語句,直到 switch 區塊的結尾,或第一次看到 break 語句。如果您在 case 的語句清單結尾沒有寫 break 語句,PHP 將繼續執行下一個 case 的語句。例如
這裡,如果 $i 等於 0,PHP 將執行所有的 echo 語句!如果 $i 等於 1,PHP 將執行最後兩個 echo 語句。只有在 $i 等於 2 時,您才會獲得預期的行為(將顯示「i 等於 2」)。因此,不要忘記 break 語句非常重要(即使您可能在某些情況下故意避免提供它們)。
在 switch 語句中,條件只會求值一次,然後將結果與每個 case 語句進行比較。在 elseif 語句中,條件會再次求值。如果您的條件比簡單比較更複雜,或是在緊密迴圈中,switch 可能會更快。
case 的語句清單也可以是空的,這只會將控制權傳遞到下一個 case 的語句清單。
一個特殊的情況是 default case。這個 case 會比對其他 case 未比對到的任何內容。例如
注意:多個 default case 將會引發 E_COMPILE_ERROR 錯誤。
注意:從技術上講,default case 可以按任何順序列出。只有在沒有其他 case 比對時才會使用它。但是,按照慣例,最好將它放在最後作為最後一個分支。
如果沒有 case 分支符合,並且沒有 default 分支,則不會執行任何程式碼,就像沒有 if 語句為 true 一樣。
case 值可以作為表達式給出。但是,該表達式將單獨求值,然後與 switch 值進行寬鬆比較。這表示它不能用於對 switch 值進行複雜的求值。例如
對於更複雜的比較,可以使用值 true 作為 switch 值。或者,也可以使用 if-else 區塊而不是 switch。
控制結構的替代語法也支援 `switch`。更多資訊請參閱控制結構的替代語法。
在 `case` 後面可以使用分號而不是冒號,例如: