else と elseif - 複数条件の処理

if 文だけでは「条件に合わないとき何もしない」という片方向の分岐しか書けない。現実のプログラムでは「合格か不合格か」「A ランクか B ランクか C ランクか」のように、複数の経路に処理を振り分ける場面のほうが圧倒的に多い。else と elseif はそのための構文である。

else の役割

else は if の条件が false だったときに実行されるブロックを定義する。

$temperature = 35;

if ($temperature >= 30) {
    echo "暑い";
} else {
    echo "暑くない";
}

この構造では必ずどちらか一方が実行される。if ブロックと else ブロックが同時に実行されることはない。else に条件式は書けず、if の条件を満たさなかった「それ以外すべて」を受け持つ。

else は省略可能であり、false のときに何もしなくてよいなら if だけで十分だ。逆に言えば else を書くということは「false の場合にも明確な処理がある」という意思表示になる。

elseif で多段分岐を作る

条件が 2 つでは足りない場合、elseif を使って分岐を増やす。

$hour = 14;

if ($hour < 6) {
    $greeting = "深夜です";
} elseif ($hour < 12) {
    $greeting = "おはようございます";
} elseif ($hour < 18) {
    $greeting = "こんにちは";
} else {
    $greeting = "こんばんは";
}

echo $greeting; // こんにちは

elseif は「直前の条件が false だったとき、さらに別の条件を試す」という意味を持つ。上から順に評価され、最初に true になったブロックだけが実行される。どの elseif にも該当しなかった場合に else が実行される。

if を評価

false なら elseif を順に評価

すべて false なら else を実行

elseif と else if

PHP では elseif(1 語)と else if(2 語)の両方が使える。通常の波括弧構文ではどちらも同じ動作をするが、代替構文(コロン構文)では違いが出る。

elseif(1 語)

波括弧構文でもコロン構文でも使える。PHP 公式ドキュメントが推奨する書き方。

else if(2 語)

波括弧構文では動作するが、コロン構文ではパースエラーになる。

// コロン構文(テンプレートで使われる)
if ($role === "admin"):
    echo "管理者";
elseif ($role === "editor"):
    echo "編集者";
else:
    echo "一般ユーザー";
endif;

コロン構文で else if を使うとエラーになる。一貫性のために常に elseif と書くのがよい。

条件の順序が結果を決める

elseif は上から順に評価されるため、条件の並べ方を間違えると意図しない結果を生む。

$score = 95;

// 誤った順序
if ($score >= 50) {
    echo "C";  // 95 点でもここに入ってしまう
} elseif ($score >= 70) {
    echo "B";
} elseif ($score >= 90) {
    echo "A";
}

$score >= 50 は 95 でも true になるため、最初のブロックで処理が終わってしまう。厳しい条件から先に書くのが鉄則だ。

$score = 95;

// 正しい順序
if ($score >= 90) {
    echo "A";  // ここに入る
} elseif ($score >= 70) {
    echo "B";
} elseif ($score >= 50) {
    echo "C";
} else {
    echo "D";
}

$value が 60 のとき、次のコードの出力はどれですか?

  • 高い
  • 普通
  • 低い
  • 何も出力されない
__RESULT__

value >= 40 が true なので「普通」が出力されます。$value >= 60 は評価されません。

この問題が示すように、elseif の順序を考えるときは「各条件が受け持つ範囲」を意識する必要がある。

else の落とし穴

else は「それ以外すべて」を受け取るため、想定外の値も処理してしまう危険がある。

function getDiscount($memberType) {
    if ($memberType === "gold") {
        return 0.3;
    } elseif ($memberType === "silver") {
        return 0.2;
    } else {
        return 0.1; // "bronze" を想定しているが…
    }
}

// 不正な値でも 0.1 が返る
echo getDiscount("invalid"); // 0.1
echo getDiscount("");         // 0.1
echo getDiscount(null);       // 0.1

else を「特定の値に対する処理」として使うと、想定外の入力を見逃す。防御的に書くなら、else の中でバリデーションを行うか、例外を投げるべきだ。

function getDiscount($memberType) {
    if ($memberType === "gold") {
        return 0.3;
    } elseif ($memberType === "silver") {
        return 0.2;
    } elseif ($memberType === "bronze") {
        return 0.1;
    } else {
        throw new InvalidArgumentException(
            "不正な会員タイプ: {$memberType}"
        );
    }
}

こうすれば不正な値が渡されたとき、黙って処理を続けるのではなくエラーとして検出できる。

ネストした if-else の整理

条件が複雑になると if-else のネストが深くなりがちである。

// 読みにくい例
function canAccess($user, $resource) {
    if ($user !== null) {
        if ($user->isActive()) {
            if ($user->hasPermission($resource)) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    } else {
        return false;
    }
}

このコードは早期リターンで平坦にできる。

function canAccess($user, $resource) {
    if ($user === null) {
        return false;
    }
    if (!$user->isActive()) {
        return false;
    }
    return $user->hasPermission($resource);
}

ネストが 1 段減るだけで可読性は大きく向上する。else を書かずに済むなら書かないほうがよい。

早期リターンの原則

異常系・例外的な条件を先に判定して return する。正常系の処理がインデントなしで書けるようになる。

else 不要の法則

if の中で return や throw をしている場合、else は論理的に不要である。書かないことでコードの意図が明確になる。

実践的な使い分け

if-else と elseif をどう使い分けるかは、分岐の性質によって決まる。

分岐の種類適した構文
二択if-else成功か失敗か
段階的な範囲elseif成績のランク分け
離散的な値の一致switch / match曜日、ステータス

elseif を 4 つ以上並べるようなコードは、switch 文や match 式のほうが読みやすくなることが多い。分岐が増えてきたら、より適切な構文がないか立ち止まって考える習慣をつけるとよい。

else と elseif は単純な構文だが、条件の順序、else の守備範囲、ネストの深さといった設計判断が絡んでくる。「動くコード」と「読みやすいコード」の差は、こうした細部の積み重ねで生まれるものだ。