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` 後面可以使用分號而不是冒號,例如: