Forum und email

switch

switch 命令的功能和一連串用同一條件表達式的 if 語句相似。 有不少的情況要求把一個變數或一句表達式和不同的數值作比較, 當它等於某一個數值時便執行相對應的程式段。 這正是 switch 的功用。

下面示範了怎樣用一連串的 if 和用一個 switch 來完成相同的工作:

if ($i == 0) {
    print "i equals 0";
}
if ($i == 1) {
    print "i equals 1";
}
if ($i == 2) {
    print "i equals 2";
}
 
switch ($i) {
    case 0:
        print "i equals 0";
        break;
    case 1:
        print "i equals 1";
        break;
    case 2:
        print "i equals 2";
        break;
}

為了避免弄錯,最好是搞明白 switch 的運作方式。 switch 是一句接一句的執行程式的。 首先 PHP 要找一個case 的值和 switch 條件表達式所演算出來的值是一樣的。 然後 PHP 會執行在那個 case 之後出現的所有指令直到 switch 程式段的最後或者直到 PHP 碰到一句 break 指令。 如果你沒有在每個 case 的最後加上 break 指令, PHP 會接下去執行接在下面的另一個 case 之中的指令! 下面的程式示範了這一點:

switch ($i) {
    case 0:
        print "i equals 0";
    case 1:
        print "i equals 1";
    case 2:
        print "i equals 2";
}

對上面程式而言, 如果 $i 是 0 的話, PHP 會執行所有的 print 指令! 如果 $i 是 1, PHP 只會執行後面兩句指令; 只有當 $i 等 2 才會得到本來想要的結果:印出 'i equals 2' 。 由此可見, 先萬別要漏了放 break 指令在每個 case 之後。 (雖然在一些情況下你可能特地不加 break。)

程式執行 switch 時, 條件表達式只會被檢查一次。 這一次的運算結果會用來和每個 case 比較; 但在 elseif 語句中該條件表達式會重新被演算一遍。 因此在條件表達式很複雜或是在速度要求很高的迴圈中用 switch 會比較快一些。

一個 case 所含的指令數目也可以是 0 個, 這樣一來程式會自動檢查下一個 case

switch ($i) {
    case 0:
    case 1:
    case 2:
        print "i is less than 3 but not negative";
        break;
    case 3:
        print "i is 3";
}

有個特殊的 case 是 default case, 如果所有的 case 都沒法成立時, default 便會被執行。 看下面的示範:

switch ($i) {
    case 0:
        print "i equals 0";
        break;
    case 1:
        print "i equals 1";
        break;
    case 2:
        print "i equals 2";
        break;
    default:
        print "i is not equal to 0, 1 or 2";
}

有效的 case 表達式一定要得出一個類形簡單的數值, 如整數、 小數或是文句。 如果是陣列的話就一定要指出陣列中的那一個元素並該元素也要是一個類型簡單的值。

swithes 也有它們另一種等效的寫法, 詳情可看 控制程式流程的等效句法 .

switch ($i):
    case 0:
        print "i equals 0";
        break;
    case 1:
        print "i equals 1";
        break;
    case 2:
        print "i equals 2";
        break;
    default:
        print "i is not equal to 0, 1 or 2";
endswitch;