The switch 文は、同じ式を用いて IF 文を並べたのに似ています。 同じ変数を異なる値と比較し、値に応じて異なったコードを実行したいと 思うことがしばしばあるかと思います。 switch 文は、まさにこのためにあるのです。
次の二つの例は、同じことを二つの異なった方法で書いたものです。 一つは、if 文を、もう一つは、switch 文を使っています。
1 2 if ($i == 0) { 3 print "i は 0 に等しい"; 4 } 5 if ($i == 1) { 6 print "i は 1 に等しい"; 7 } 8 if ($i == 2) { 9 print "i は 2 に等しい"; 10 } 11 12 switch ($i) { 13 case 0: 14 print "i は 0 に等しい"; 15 break; 16 case 1: 17 print "i は 1 に等しい"; 18 break; 19 case 2: 20 print "i は 2 に等しい"; 21 break; 22 } 23 |
失敗を避けるために switch 文がどのように実行されるのかを 理解することが重要です。 switch文は、行毎に実行されます。(実際には、文毎に実行されます。) 初めは、何も実行しません。 switch式の値と一致する値を有する case文 が見つけられたときに PHP は命令の実行を開始します。 PHP は switch ブロックの終わりまたは最初の break 文まで実行を続けます。 CASE 文の終わりに break 文を書かない場合は、PHP は 次の CASE 文を実行しつづけます。例えば、
1 2 switch ($i) { 3 case 0: 4 print "i は 0 に等しい"; 5 case 1: 6 print "i は 1 に等しい"; 7 case 2: 8 print "i は 2 に等しい"; 9 } 10 |
ここで、$i が 0 に等しい場合は、PHP は全ての文を出力してしまいます! $i が 1 の場合、PHP は最後の二つの文を出力します。 $i が 2 に等しい場合のみ、'期待した'動作をし、 'i は 2 に等しい' と表示します。 このため、(ある種の状況下では、BREAK を付加することを避けたいと 思うかもしれませんが、) break 文を忘れないようにすることは重要です。
switch文では、条件は1度だけ評価され、 その結果が各case文と比較されます。 elseif文では、条件は、再度評価されます。 使用する条件が単純な比較処理よりも複雑な処理を行ったり、 重い繰り返し処理を行う場合、switchの方が より処理が速い可能性があります。
case に付随する文は、空とすることが可能です。 この場合、次の case に付随する文に制御が移行します。
1 2 switch ($i) { 3 case 0: 4 case 1: 5 case 2: 6 print "i は 3 より小さいですが負ではありません"; 7 break; 8 case 3: 9 print "i は3です"; 10 } 11 |
default は、case 文の特別な場合です。 これは、他の全ての case にマッチしない場合に、 実行されます。例を以下に示します。
1 2 switch ($i) { 3 case 0: 4 print "i は 0 に等しい"; 5 break; 6 case 1: 7 print "i は 1 に等しい"; 8 break; 9 case 2: 10 print "i は 2 に等しい"; 11 break; 12 default: 13 print "i は 0, 1 ,2 に等しくない"; 14 } 15 |
case 式は、スカラー型に式を評価する 任意の式、つまり、整数又は浮動小数点、文字列、とすることができます。 配列又はオブジェクトは、単純な型を指していない限り 使用することができません。
switch 文の制御構造に関する別の構文がサポートされています。 詳細は、制御構造に関する別の構文 を参照下さい。
1 2 switch ($i): 3 case 0: 4 print "i は 0 に等しい"; 5 break; 6 case 1: 7 print "i は 1 に等しい"; 8 break; 9 case 2: 10 print "i は 2 に等しい"; 11 break; 12 default: 13 print "i は 0 でも 1 でも 2 でもない"; 14 endswitch; 15 |