跳轉到內容

PHP 程式設計/switch 結構

來自華夏公益教科書,開放的書籍,開放的世界

switch case

[編輯 | 編輯原始碼]

工作原理

[編輯 | 編輯原始碼]

這是一個簡單的遊戲示例,使用者輸入一個 $user_command,然後執行不同的函式

if ($user_command == "n") {
  go_north();
} else if ($user_command == "e") {
  go_east();
} else if ($user_command == "s") {
  go_south();
} else if ($user_command == "w") {
  go_west();
} else {
  do_something_else();
}

很明顯,這裡有很多重複程式碼。switch case 結構允許你避免這種冗餘程式碼。它允許程式設計師重複地將某個變數的值與一組可能的值進行比較,並根據結果執行程式碼。這是 switch case 語句的語法,與使用 if 語句編寫的相同程式碼相比

if 語句風格 switch case 風格
if ($firstvariable == 'comparison1' 
    || $firstvariable == 'comparison2') {

  doSomething();
  doSomethingElse();
} else if ($firstvariable == 'comparison3') {
  doAThirdThing();
} else {
  launchMissiles();
}
// Look at how much switch case saves you!
switch($firstvariable) {
  case 'comparison1':
  case 'comparison2':
    doSomething();
    doSomethingElse();
    break;
  
  case 'comparison3':
    doAThirdThing();
    break;
  
  default: 
    launchMissiles();
    break;
}

switch case 風格將使你免於重新輸入 $firstvariable,並使你的程式碼看起來更簡潔(特別是如果該程式碼是簡單的 if 語句的長鏈)。回到我們的 zorkmid 示例程式,我們有

原始程式碼 switch-case 程式碼
if ($user_command == "n") {
  go_north();
} else if ($user_command == "e") {
  go_east();
} else if ($user_command == "s") {
  go_south();
} else if ($user_command == "w") {
  go_west();
} else {
  do_something_else();
}
switch($user_command) {
  case 'n':
    go_north();
    break;
  case 'e':
    go_east();
    break;
  case 's':
    go_south();
    break;
  case 'w':
    go_west();
    break;
  default:
    do_something_else();
    break;
}
switch($var) {
  case [value]:
    [code]
    break;
  
  case [value]:
    [code]
    break;
  
  ...
  
  default:
    [code]
    break;
}

在這個例子中,$var 是第一個要比較的變數。然後,這個變數將從上到下與每個 case 語句進行比較,直到找到匹配項。此時,程式碼將執行,直到遇到 break 語句(這將允許你完全退出 case 語句)。

關於使用 switch case 語句的重要警告

[編輯 | 編輯原始碼]

不要忘記在需要中斷時使用 break!如果你忘記了,你可能會執行你不打算執行的函式。然而,在某些情況下,省略 break 可能是有用的。請看這個例子

switch ($n) {
  case 0:
  case 1:
  case 2:
    //only executes, if $n is 0, 1 or 2
    doSomethingForNumbers2OrSmaller();
    break;
  case 3:
    //only executes, if $n is 3
    doSomethingForNumber3();
  default:
    //only executes, if $n is 3 or above
    doSomethingForNumbers3OrBigger();
    break;
}

這種編碼方式有時會被認為是不好的,因為它並不總是清楚地表明程式碼的意圖。此外,請考慮對沒有 break 的 case 語句進行註釋;在下一個 case 之前的語句,這樣當其他人檢視你的程式碼時,他們就知道不要新增 break。在這種情況下,最好在無 break 的 case 中添加註釋,以便明確地表明省略 break 是有意為之的

switch ($n) {
  case 0:
    // Falls through!
  case 1:
    doSomethingForLargeNumbers();
    // Falls through!
  case 2:
    doSomethingForSmallerNumbers();
    break;
  
}

更多資訊

[編輯 | 編輯原始碼]


華夏公益教科書