[PHP]elseとは?条件に合致しない場合の処理を定義する構文を徹底解説

PHP

はじめに

前回の記事では、条件分岐の基本構文 if を解説し、その中で else にも軽く触れました。今回は、この else を正面から取り上げます。

else は、if(および elseif)で指定したすべての条件が false だった場合に実行される、「それ以外の場合」の処理を定義するための構文です。単体では機能せず、必ず if と組み合わせて使われます。一見シンプルな構文ですが、「本当に else が必要かどうか」を見極めることは、読みやすく保守しやすいコードを書く上で意外と重要な設計判断になります。本記事では基本的な使い方から、else を使うべき場面・避けるべき場面、実践的な活用例まで詳しく解説します。


構文概要

項目内容
構文名else
種別制御構造(言語構文、ifと組み合わせて使用)
基本構文if (条件式) { ... } else { ... }
単独での使用不可(必ずif/elseifの後に続ける必要がある)
代替構文if (...): ... else: ... endif;(テンプレート内で使われることが多い)
対応バージョンPHP 4以前から存在する最古参の構文の一つ
評価タイミング直前のif/elseifの条件がすべてfalseの場合にのみ実行される

elseの実行条件(イメージ図)

  if ($a > 10) {
      // ケース1: $aが10より大きい場合
  } elseif ($a > 5) {
      // ケース2: $aが5より大きく10以下の場合
  } else {
      // ★これまでのどの条件にも当てはまらない場合
      // ($aが5以下の場合)
  }
              │
              ▼
  elseブロックは、「それより前にあるすべての
  if/elseifの条件がfalseだった」という
  唯一の条件でのみ実行される

ポイントは、else が明示的な条件式を持たないという点です。「これまでのどの条件にも当てはまらなかった場合」を表す、いわば「残り全部」を受け止める役割を担います。


実践サンプル7選

例1:基本的な使い方

<?php

$temperature = 15;

if ($temperature >= 25) {
    echo '暑いです' . PHP_EOL;
} else {
    echo '暑くはありません' . PHP_EOL;
}

例2:elseifとの組み合わせでのelseの役割

<?php

function describeDayType(string $day): string
{
    if ($day === 'Saturday' || $day === 'Sunday') {
        return '週末';
    } elseif ($day === 'Friday') {
        return '花金';
    } else {
        // 月〜木曜日はすべてここに該当する
        return '平日';
    }
}

echo describeDayType('Monday') . PHP_EOL;  // "平日"
echo describeDayType('Friday') . PHP_EOL;  // "花金"

例3:テンプレート内での代替構文を使ったelse

<?php $items = []; ?>

<div>
<?php if (!empty($items)): ?>
    <ul>
    <?php foreach ($items as $item): ?>
        <li><?= htmlspecialchars($item) ?></li>
    <?php endforeach; ?>
    </ul>
<?php else: ?>
    <p>該当するアイテムがありません</p>
<?php endif; ?>
</div>

例4:ガード節(早期リターン)によってelseを省略する設計

<?php

class DiscountCalculator
{
    /**
     * elseを使わず、条件に合致しない場合は早期リターンすることで
     * ネストを浅くし、コードの見通しを良くする
     */
    public function calculate(int $price, bool $isMember): int
    {
        if (!$isMember) {
            return $price; // 会員でなければ即座に通常価格を返す
        }

        // 以降は会員の場合の処理のみを考えればよい(elseが不要になる)
        return (int) ($price * 0.9);
    }
}

$calculator = new DiscountCalculator();
echo $calculator->calculate(1000, true) . PHP_EOL;  // 900
echo $calculator->calculate(1000, false) . PHP_EOL; // 1000

例5:ネストしたif–elseの構造を整理する

<?php

function classifyBmi(float $bmi): string
{
    if ($bmi < 18.5) {
        return '低体重';
    } else {
        if ($bmi < 25) {
            return '普通体重';
        } else {
            // elseifを使えばネストを1段階減らせる典型的な例
            return '肥満';
        }
    }
}

// elseifを使った、より読みやすい書き換え
function classifyBmiImproved(float $bmi): string
{
    if ($bmi < 18.5) {
        return '低体重';
    } elseif ($bmi < 25) {
        return '普通体重';
    } else {
        return '肥満';
    }
}

echo classifyBmiImproved(22.5) . PHP_EOL;

例6:三項演算子で置き換え可能な単純なelse

<?php

$score = 75;

// シンプルな値の選択であれば、elseを使ったif文は冗長になりがち
if ($score >= 60) {
    $result = '合格';
} else {
    $result = '不合格';
}
echo $result . PHP_EOL;

// 三項演算子を使えば1行で同じことを表現できる
$result2 = $score >= 60 ? '合格' : '不合格';
echo $result2 . PHP_EOL;

例7:elseがない場合との挙動の違いを確認する

<?php

function processWithElse(int $value): string
{
    if ($value > 0) {
        return '正の数です';
    } else {
        return '0または負の数です';
    }
}

function processWithoutElse(int $value): string
{
    if ($value > 0) {
        return '正の数です';
    }

    // elseを使わなくても、ifブロック内でreturnしていれば
    // この行は「条件に合致しない場合」の処理として自然に機能する
    return '0または負の数です';
}

echo processWithElse(-5) . PHP_EOL;
echo processWithoutElse(-5) . PHP_EOL;
// 両方とも同じ結果になるが、後者の方がネストが浅い

関連機能との比較

機能役割elseとの違い
elseif/elseifの条件がすべてfalseの場合に実行される本記事の対象。条件式を持たない「残り全部」の受け皿
elseif前の条件がfalseの場合に、新たな条件で判定する独自の条件式を持つ点がelseと異なる
三項演算子(?:)条件に応じて2つの値のどちらかを返す式単純な値の選択であれば、if–elseより簡潔に書ける
ガード節(早期リターン)条件に合致しない場合に早期に処理を終える設計パターンelseブロック自体を省略し、ネストを浅くする代替アプローチ
default(switch/match内)いずれのケースにも合致しない場合の処理switchやmatch構文におけるelseに相当する役割

よくある落とし穴(注意点)

  1. elseは単独では使えない else は必ず if(または elseif)の直後に続ける必要があり、単体の制御構造として存在することはできません。
  2. 深いネストを生み出す原因になりやすい if–else を何重にも入れ子にすると、コードが非常に読みにくくなります。ガード節(早期リターン)のパターンを使うことで、else 自体が不要になり、ネストを浅く保てる場合が多くあります(例4・例7を参照)。
  3. 単純な値の選択にはelse付きのifが冗長になることがある 「条件によって変数に代入する値を変えるだけ」のような単純なケースでは、if–else よりも三項演算子(?:)を使った方が、コードが簡潔になります(例6を参照)。
  4. ネストしたif–elseはelseifで整理できる else の中に新たな if–else を書くパターンは、多くの場合 elseif を使うことで、インデントの深さを1段階減らし、読みやすく書き換えられます(例5を参照)。
  5. 代替構文(コロン構文)での閉じ方を間違えない HTMLテンプレート内でよく使われる if (...): ... else: ... endif; という代替構文では、else の後にもコロン(:)が必要です。中括弧構文の感覚で else { のように書いてしまうと構文エラーになります(例3を参照)。

まとめ

観点まとめ
何をする構文かif/elseifの条件がすべてfalseだった場合に実行される処理を定義する
主な用途条件に合致しない場合のデフォルト処理、エラーメッセージの表示
単独使用不可。必ずif(またはelseif)と組み合わせて使う
省略の検討ガード節(早期リターン)を使うことで、else自体を省略しコードを簡潔にできる場合が多い
注意点深いネストを招きやすいこと、単純な値選択には三項演算子の方が適する場合があること

else は、if と対になる基本的な制御構造ですが、「本当に必要か」を常に意識することが、読みやすいコードを書く上で重要です。ガード節による早期リターンや、三項演算子への置き換えを検討することで、else に頼りすぎない、見通しの良いコード設計を心がけましょう。

タイトルとURLをコピーしました