switch
(PHP 4, PHP 5, PHP 7, PHP 8)
switch
文は、同じ式を用いてIF文を並べたのに似ています。
同じ変数を異なる値と比較し、値に応じて異なったコードを実行したいと
思うことがしばしばあるかと思います。
switch
文は、まさにこのためにあるのです。
注意:
他の言語とは違って、 continue命令は
switch
にも適用され、break
と同じ動作をします。 ループの内部でswitch
を使用しており、 外側のループの処理を続行させたい場合には、continue 2
を使用してください。
注意:
switch/case が行うのは、 緩やかな比較 であることに注意しましょう。
次の二つの例は、同じことを二つの異なった方法で書いたものです。
一つは、if
文を、もう一つはswitch
文を使っています。
例1 switch
構造
<?phpif ($i == 0) { echo "iは0に等しい";} elseif ($i == 1) { echo "iは1に等しい";} elseif ($i == 2) { echo "iは2に等しい";}switch ($i) { case 0: echo "iは0に等しい"; break; case 1: echo "iは1に等しい"; break; case 2: echo "iは2に等しい"; break;}?>
例2 switch
構造では文字列を使用できる
<?phpswitch ($i) { case "apple": echo "i is apple"; break; case "bar": echo "i is bar"; break; case "cake": echo "i is cake"; break;}?>
失敗を避けるためにswitch
文がどのように実行されるのかを
理解することが重要です。
switch
文は、行毎に実行されます。
(実際には、文毎に実行されます。)初めは、何も実行しません。
switch
式の値と同じ値として評価される式を有する
case
文が見つけられたときに初めてPHPにより
命令の実行が行われます。
PHPはswitch
ブロックの終わりまたは最初の
break
文まで実行を続けます。
CASE文の終わりにbreak
文を書かない場合は、PHPは
次のCASE文を実行しつづけます。例えば、
<?phpswitch ($i) { case 0: echo "iは0に等しい"; case 1: echo "iは1に等しい"; case 2: echo "iは2に等しい";}?>
ここで、$i
が0に等しい場合は、PHPは全ての echo
文を出力してしまいます!
$i
が1の場合、PHPは最後の二つの echo 文を出力します。
$i
が2に等しい場合のみ、'期待した'動作をし、
'iは2に等しい'と表示します。
このため (ある種の状況下では、BREAKを付加することを避けたいと
思うかもしれませんが)、
break
文を忘れないようにすることが重要です。
switch
文では、条件は1度だけ評価され、
その結果が各case
文と比較されます。
elseif
文では、条件は、再度評価されます。
使用する条件が単純な比較処理よりも複雑な処理を行ったり、
重い繰り返し処理を行う場合、switch
の方が
より処理が速い可能性があります。
caseに付随する文は、空とすることが可能です。 この場合、次のcaseに付随する文に制御が移行します。
<?phpswitch ($i) { case 0: case 1: case 2: echo "iは3より小さいですが負ではありません"; break; case 3: echo "iは3です";}?>
default
は、case 文の特別な場合です。これは他の全ての case
にマッチしない場合に実行されます。例を以下に示します。
<?phpswitch ($i) { case 0: echo "iは0に等しい"; break; case 1: echo "iは1に等しい"; break; case 2: echo "iは2に等しい"; break; default: echo "iは0,1,2に等しくない";}?>
注意:
複数の
default
を置くと、E_COMPILE_ERROR
エラーが発生します。
switch文の制御構造に関する別の構文がサポートされています。 詳細は、 制御構造に関する別の構文を参照ください。
<?phpswitch ($i): case 0: echo "iは0に等しい"; break; case 1: echo "iは1に等しい"; break; case 2: echo "iは2に等しい"; break; default: echo "iは0でも1でも2でもない";endswitch;?>
case の最後はコロンではなくセミコロンとすることもできます。たとえば次のようになります。
<?phpswitch($beer){ case 'ツボルグ'; case 'カールスバーグ'; case 'ハイネケン'; echo 'いいっすねぇ'; break; default; echo 'ほかのを選んでみませんか?'; break;}?>