## *switch*
(PHP 4, PHP 5, PHP 7)
*switch* 語句類似于具有同一個表達式的一系列 *if* 語句。很多場合下需要把同一個變量(或表達式)與很多不同的值比較,并根據它等于哪個值來執行不同的代碼。這正是 *switch* 語句的用途。
> **Note**: 注意和其它語言不同,[continue](http://php.net/manual/zh/control-structures.continue.php) 語句作用到 switch 上的作用類似于 *break*。如果在循環中有一個 switch 并希望 continue 到外層循環中的下一輪循環,用 *continue 2*。
> **Note**:
> 注意 switch/case 作的是[松散比較](http://php.net/manual/zh/types.comparisons.php#types.comparisions-loose)。
下面兩個例子使用兩種不同方法實現同樣的事,一個用一系列的 *if* 和 *elseif* 語句,另一個用 *switch* 語句:
**Example #1 *switch* 結構**
```
<?php
if?($i?==?0)?{
????echo?"i?equals?0";
}?elseif?($i?==?1)?{
????echo?"i?equals?1";
}?elseif?($i?==?2)?{
????echo?"i?equals?2";
}
switch?($i)?{
????case?0:
????????echo?"i?equals?0";
????????break;
????case?1:
????????echo?"i?equals?1";
????????break;
????case?2:
????????echo?"i?equals?2";
????????break;
}
?>
```
**Example #2 *switch* 結構可以用字符串**
```
<?php
switch?($i)?{
case?"apple":
????echo?"i?is?apple";
????break;
case?"bar":
????echo?"i?is?bar";
????break;
case?"cake":
????echo?"i?is?cake";
????break;
}
?>
```
為避免錯誤,理解 *switch* 是怎樣執行的非常重要。*switch* 語句一行接一行地執行(實際上是語句接語句)。開始時沒有代碼被執行。僅當一個 *case* 語句中的值和 *switch* 表達式的值匹配時 PHP 才開始執行語句,直到 *switch* 的程序段結束或者遇到第一個 *break* 語句為止。如果不在 case 的語句段最后寫上 *break* 的話,PHP 將繼續執行下一個 case 中的語句段。例如:
```
<?php
switch?($i)?{
????case?0:
????????echo?"i?equals?0";
????case?1:
????????echo?"i?equals?1";
????case?2:
????????echo?"i?equals?2";
}
?>
```
這里如果 $i 等于 0,PHP 將執行所有的 echo 語句!如果 $i 等于 1,PHP 將執行后面兩條 echo 語句。只有當 $i 等于 2 時,才會得到“預期”的結果——只顯示“i equals 2”。所以,別忘了 *break* 語句就很重要(即使在某些情況下故意想避免提供它們時)。
在 *switch* 語句中條件只求值一次并用來和每個 *case* 語句比較。在 *elseif* 語句中條件會再次求值。如果條件比一個簡單的比較要復雜得多或者在一個很多次的循環中,那么用 *switch* 語句可能會快一些。
在一個 case 中的語句也可以為空,這樣只不過將控制轉移到了下一個 case 中的語句。
```
<?php
switch?($i)?{
????case?0:
????case?1:
????case?2:
????????echo?"i?is?less?than?3?but?not?negative";
????????break;
????case?3:
????????echo?"i?is?3";
}
?>
```
一個 case 的特例是 *default*。它匹配了任何和其它 case 都不匹配的情況。例如:
```
<?php
switch?($i)?{
????case?0:
????????echo?"i?equals?0";
????????break;
????case?1:
????????echo?"i?equals?1";
????????break;
????case?2:
????????echo?"i?equals?2";
????????break;
????default:
????????echo?"i?is?not?equal?to?0,?1?or?2";
}
?>
```
*case* 表達式可以是任何求值為簡單類型的表達式,即整型或浮點數以及字符串。不能用數組或對象,除非它們被解除引用成為簡單類型。
*switch* 支持替代語法的流程控制。更多信息見[流程控制的替代語法](http://php.net/manual/zh/control-structures.alternative-syntax.php)一節。
```
<?php
switch?($i):
????case?0:
????????echo?"i?equals?0";
????????break;
????case?1:
????????echo?"i?equals?1";
????????break;
????case?2:
????????echo?"i?equals?2";
????????break;
????default:
????????echo?"i?is?not?equal?to?0,?1?or?2";
endswitch;
?>
```
允許使用分號代替 case 語句后的冒號,例如:
```
<?php
switch($beer)
{
????case?'tuborg';
????case?'carlsberg';
????case?'heineken';
????????echo?'Good?choice';
????break;
????default;
????????echo?'Please?make?a?new?selection...';
????break;
}
?>
```
- 序言
- 簡介
- PHP是什么?
- PHP能做什么?
- 基本語法
- 類型
- boolean(布爾型)
- integer(整型)
- float(浮點型)
- string(字符串)
- array(數組)
- object(對象)
- callable(可調用)
- resource(資源)
- NULL(無類型)
- 偽類型
- 類型轉換的判別
- 變量
- 基礎
- 預定義變量
- 變量范圍
- 可變變量
- 來自PHP之外的變量
- 常量
- 語法
- 魔術常量
- 表達式
- 運算符
- 運算符優先級
- 算術運算符
- 賦值運算符
- 位運算符
- 比較運算符
- 錯誤控制運算符
- 執行運算符
- 遞增/遞減運算符
- 邏輯運算符
- 字符串運算符
- 數組運算符
- 類型運算符
- 流程控制
- if
- else
- elseif/else if
- 流程控制的替代語法
- while
- do-whille
- for
- foreach
- break
- continue
- switch
- declare
- return
- require
- include
- require_once
- include_once
- goto
- 函數
- 用戶自定義函數
- 函數的參數
- 返回值
- 可變函數
- 內部 (內置)函數
- 匿名函數
- 類與對象
- 簡介
- 基本概念
- 屬性
- 類的自動加載
- 構造函數
- 訪問控制(可見性)