(PHP 4, PHP 5, PHP 7, PHP 8)
switch
文は、同じ式を用いてIF文を並べたのに似ています。 同じ変数を異なる値と比較し、値に応じて異なったコードを実行したいと 思うことがしばしばあるかと思います。 switch
文は、まさにこのためにあるのです。
注意: 他の言語とは違って、 continue命令は
switch
にも適用され、break
と同じ動作をします。 ループの内部でswitch
を使用しており、 外側のループの処理を続行させたい場合には、continue 2
を使用してください。
注意:
switch/case が行うのは、 緩やかな比較 であることに注意しましょう。
次の二つの例は、同じことを二つの異なった方法で書いたものです。 一つは、if
と elseif
文を、 もう一つはswitch
文を使っています。 どちらも、出力は同じです。
例1 switch
文の構造
<?php
// これが swtich 文です:
switch ($i) {
case 0:
echo "iは0に等しい";
break;
case 1:
echo "iは1に等しい";
break;
case 2:
echo "iは2に等しい";
break;
}
// 上記は、下記と同じです:
if ($i == 0) {
echo "iは0に等しい";
} elseif ($i == 1) {
echo "iは1に等しい";
} elseif ($i == 2) {
echo "iは2に等しい";
}
?>
失敗を避けるためにswitch
文がどのように実行されるのかを 理解することが重要です。 switch
文は、行毎に実行されます。 (実際には、文毎に実行されます。)初めは、何も実行しません。 switch
式の値と同じ値として評価される式を有する case
文が見つけられたときに初めてPHPにより 命令の実行が行われます。 PHPはswitch
ブロックの終わりまたは最初の break
文まで実行を続けます。 CASE文の終わりにbreak
文を書かない場合は、PHPは 次のCASE文を実行しつづけます。例えば、
<?php
switch ($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に付随する文に制御が移行します。
<?php
switch ($i) {
case 0:
case 1:
case 2:
echo "iは3より小さいですが負ではありません";
break;
case 3:
echo "iは3です";
}
?>
default
は、case 文の特別な場合です。これは他の全ての case にマッチしない場合に実行されます。例を以下に示します。
<?php
switch ($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
エラーが発生します。
注意: 技術的には、
default
は switch 文の中のどの位置でも置くことができます。default
は他の case にマッチしなかった場合に使われるものです。 しかし、規約上は最後に置くのが一番です。
どの case
にもマッチせず、 default
も存在しない場合、 どのコードも実行されません。これは、 どの if
文も true でなかった場合と同じです。
case に与える値は、式であっても構いません。 しかし、式はそれ自体が実行され、 その結果が swtich に与えた値と緩やかに比較されます。 これは、switch に与える値の複雑な評価には使えないということです。 たとえば、以下の例を見てみましょう:
<?php
$target = 1;
$start = 3;
switch ($target) {
case $start - 1:
print "A";
break;
case $start - 2:
print "B";
break;
case $start - 3:
print "C";
break;
case $start - 4:
print "D";
break;
}
// "B" を出力します。
?>
もっと複雑な比較を行うには、 true
をswitch文の値として指定するやり方が使えます。 もしくは、switch
文ではなく、 if
-else
ブロックが使えます。
<?php
$offset = 1;
$start = 3;
switch (true) {
case $start - $offset === 1:
print "A";
break;
case $start - $offset === 2:
print "B";
break;
case $start - $offset === 3:
print "C";
break;
case $start - $offset === 4:
print "D";
break;
}
// "B" を出力します。
?>
switch文の制御構造に関する別の構文がサポートされています。 詳細は、 制御構造に関する別の構文を参照ください。
<?php
switch ($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 の最後はコロンではなくセミコロンとすることもできます。たとえば次のようになります。
<?php
switch($beer)
{
case 'ツボルグ';
case 'カールスバーグ';
case 'ステラ';
case 'ハイネケン';
echo 'いいっすねぇ';
break;
default;
echo 'ほかのを選んでみませんか?';
break;
}
?>