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 語)の両方が使える。通常の波括弧構文ではどちらも同じ動作をするが、代替構文(コロン構文)では違いが出る。
波括弧構文でもコロン構文でも使える。PHP 公式ドキュメントが推奨する書き方。
波括弧構文では動作するが、コロン構文ではパースエラーになる。
// コロン構文(テンプレートで使われる)
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 のとき、次のコードの出力はどれですか?
- 高い
- 普通
- 低い
- 何も出力されない
この問題が示すように、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.1else を「特定の値に対する処理」として使うと、想定外の入力を見逃す。防御的に書くなら、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 する。正常系の処理がインデントなしで書けるようになる。
if の中で return や throw をしている場合、else は論理的に不要である。書かないことでコードの意図が明確になる。
実践的な使い分け
if-else と elseif をどう使い分けるかは、分岐の性質によって決まる。
| 分岐の種類 | 適した構文 | 例 |
|---|---|---|
| 二択 | if-else | 成功か失敗か |
| 段階的な範囲 | elseif | 成績のランク分け |
| 離散的な値の一致 | switch / match | 曜日、ステータス |
elseif を 4 つ以上並べるようなコードは、switch 文や match 式のほうが読みやすくなることが多い。分岐が増えてきたら、より適切な構文がないか立ち止まって考える習慣をつけるとよい。
else と elseif は単純な構文だが、条件の順序、else の守備範囲、ネストの深さといった設計判断が絡んでくる。「動くコード」と「読みやすいコード」の差は、こうした細部の積み重ねで生まれるものだ。
value>=80‘はfalse、次の‘value >= 40が true なので「普通」が出力されます。$value >= 60は評価されません。