PHP if else で条件ロジックを分岐する方法
PHP の if else は真偽式を評価し、結果に応じて2つ以上のコードブロックのどれかを実行します。結果が相互排他的で順序に依存する場合は、elseif で追加条件を連結します。実行されるのは最初に一致した分岐だけなので、最も厳しい条件を先に置きます。範囲チェック、複合式、型が混在する判定に依存する分岐ロジックでは、if/elseif/else が基本の制御構文になります。
条件分岐のための PHP If Else の例
出力:
ここに出力が表示されます...
出力:
成績: B
この例の仕組み
$scoreは82という整数値を保持します。if条件$score >= 90はfalseなので、PHP はそのブロックをスキップします。elseif条件$score >= 80はtrueなので、PHP は2つ目のブロックを実行して成績: Bを出力します。- すでに前の分岐が一致しているため、
elseブロックは実行されません。PHP は最初の truthy 条件に一致した時点でチェーンの評価を止めます。
PHP の elseif とは?
PHP の elseif は、既存の if ブロックに新しい条件を追加します。PHP は各 elseif を上から順に評価し、true になった最初の分岐だけを実行して残りをスキップします。必要なだけ elseif を重ねられますが、通常は3〜4個を超えると match やルックアップ配列に置き換えた方が読みやすくなります。中かっこ構文では else if(2語)と elseif(1語)は同じ挙動ですが、代替構文(if: ... endif;)では1語の elseif だけが有効です。
PHP If Else でよくある間違い
条件式で == や === ではなく = を使う
悪い例:
if ($role = "admin") { // $role に "admin" を代入し、常に truthy
echo "アクセスを許可";
}
正しい例:
if ($role === "admin") {
echo "アクセスを許可";
}
if の中で代入すると変数の値が書き換わり、代入した値自体が返るため、分岐が無条件に実行される原因になります。
中かっこを省略してインデント頼みにする(dangling else)
悪い例:
if ($isAdmin)
if ($isActive)
echo "ok";
else
echo "管理者ではありません"; // 内側の if に結び付く
正しい例:
if (!$isAdmin) {
echo "管理者ではありません";
} elseif ($isActive) {
echo "ok";
}
中かっこがない場合、else は未対応の最も近い if に結び付きます。中かっこを使うか、1つの if/elseif/else チェーンに組み直してください。
PHP If/Elseif と Switch と Match の違い
| 機能 | if/elseif | switch | match (PHP 8+) |
|---|---|---|---|
| 比較の種類 | 任意の式 | 緩やかな比較 (==) | 厳密比較 (===) |
| 値を返すか | いいえ | いいえ | はい |
| フォールスルー | 該当なし | あり(break がない場合) | なし |
| 向いている用途 | 範囲判定、複合条件 | 共有ロジックを持つ多数の離散値 | 離散値を厳密比較で結果に対応付ける場合 |
条件に範囲判定、複合ロジック、関数呼び出しが含まれる場合は if/elseif を使います。離散値を厳密比較で結果に対応付けるなら match に切り替えます。case ごとにフォールスルーや文ブロックが必要な場合は switch を使います。
さらに例を見る
ネストを減らすガード節:
function process($input) {
if (!is_string($input)) {
return "無効な型";
}
if ($input === "") {
return "空文字列";
}
return strtoupper($input);
}
早期 return を使うと、ネストした if/else ツリーを置き換えて、メインロジックを最上位のインデントに保てます。
単純な2分岐代入には三項演算子の短縮形:
$label = ($count > 0) ? "項目あり" : "空";
分岐の結果が単一の値になる場合、三項演算子 ? : を使うと完全な if/else ブロックを1つの式で置き換えられます。
FAQ
PHP で elseif と else if の違いは何ですか?
中かっこ構文({ })では両者は同等で、PHP は else if を else の後にネストされた if として扱います。代替構文(if: ... endif;)では、1語の elseif だけがコンパイルされます。スタイル間のリファクタリングで構文エラーを避けるため、常に elseif を使うのが安全です。
PHP の条件式は == と === のどちらを使うべきですか?
== は型変換を伴う比較を行います。PHP 7 では 0 == "foo" は true でしたが、PHP 8 では非数値文字列に対して false に変更されました。=== は型変換せず、値と型の両方を比較します。特にユーザー入力や混在型データでは、予測可能な結果のために === を優先してください。
PHP では elseif を複数書けますか?
はい。PHP では1つのチェーンに elseif をいくつでも追加できます。条件は上から順に評価され、実行されるのは最初に truthy になった分岐だけです。どれも一致せず else がある場合は、それがデフォルトとして実行されます。分岐が4〜5個を超えるなら、match やルックアップ配列の方が読みやすくなります。