PHP マニュアル
前のページ | 第 12 章 制御構造 | 次のページ

# `switch`

`switch`文は、同じ式を用いてIF文を並べたのに似ています。 同じ変数を異なる値と比較し、値に応じて異なったコードを実行したいと 思うことがしばしばあるかと思います。 `switch`文は、まさにこのためにあるのです。

次の二つの例は、同じことを二つの異なった方法で書いたものです。 一つは、`if`文を、もう一つは`switch` 文を使っています。

    if ($i == 0) {
       print "iは0に等しい";
    }
    if ($i == 1) {
       print "iは1に等しい";
    }
    if ($i == 2) {
       print "iは2に等しい";
    }

    switch ($i) {
        case 0:
            print "iは0に等しい";
            break;
        case 1:
            print "iは1に等しい";
            break;
        case 2:
            print "iは2に等しい";
            break;
    }

失敗を避けるために`switch`文がどのように実行されるのかを 理解することが重要です。 `switch`文は、行毎に実行されます。 (実際には、文毎に実行されます。)初めは、何も実行しません。 `switch`式の値と一致する値を有する `case`文が見つけられたときに初めてPHにより 命令の実行が行われます。 PHPは`switch`ブロックの終わりまたは最初の `break`文まで実行を続けます。 CASE文の終わりに`break`文を書かない場合は、PHPは 次のCASE文を実行しつづけます。例えば、

    switch ($i) {
        case 0:
            print "iは0に等しい";
        case 1:
            print "iは1に等しい";
        case 2:
            print "iは2に等しい";
    }

ここで、$iが0に等しい場合は、PHPは全ての文を出力してしまいます! $iが1の場合、PHPは最後の二つの文を出力します。 $iが2に等しい場合のみ、'期待した'動作をし、'iは2に等しい'と表示します。 このため、(ある種の状況下では、BREAKを付加することを避けたいと 思うかもしれませんが、) `break`文を忘れないようにすることが重要です。

`switch`文では、条件は1度だけ評価され、 その結果が各`case`文と比較されます。 `elseif`文では、条件は、再度評価されます。 使用する条件が単純な比較処理よりも複雑な処理を行ったり、 重い繰り返し処理を行う場合、`switch`の方が より処理が速い可能性があります。

caseに付随する文は、空とすることが可能です。 この場合、次のcaseに付随する文に制御が移行します。

    switch ($i) {
        case 0:
        case 1:
        case 2:
            print "iは3より小さいですが負ではありません";
            break;
        case 3:
            print "iは3です";
    }

defaultは、case文の特別な場合です。これは他の全てのcaseに マッチしない場合に実行され、最後の `case` 文に置 く必要があります。例を以下に示します。

    switch ($i) {
        case 0:
            print "iは0に等しい";
            break;
        case 1:
            print "iは1に等しい";
            break;
        case 2:
            print "iは2に等しい";
            break;
        default:
            print "iは0,1,2に等しくない";
    }

`case`式は、スカラー型に式を評価する 任意の式、つまり、整数、浮動小数点、文字列とすることができます。 配列又はオブジェクトは、単純な型にキャストされていない限り 使用することができません。

switch文の制御構造に関する別の構文がサポートされています。 詳細は、 制御構造に関する別の構文を参照下さい。

    switch ($i):
        case 0:
            print "iは0に等しい";
            break;
        case 1:
            print "iは1に等しい";
            break;
        case 2:
            print "iは2に等しい";
            break;
        default:
            print "iは0でも1でも2でもない";
    endswitch;

前のページ | ホーム | 次のページ
`continue` | 上に戻る | `declare`