はじめに
前回の記事では、条件分岐の基本構文 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との違い |
|---|---|---|
else | if/elseifの条件がすべてfalseの場合に実行される | 本記事の対象。条件式を持たない「残り全部」の受け皿 |
elseif | 前の条件がfalseの場合に、新たな条件で判定する | 独自の条件式を持つ点がelseと異なる |
三項演算子(?:) | 条件に応じて2つの値のどちらかを返す式 | 単純な値の選択であれば、if–elseより簡潔に書ける |
| ガード節(早期リターン) | 条件に合致しない場合に早期に処理を終える設計パターン | elseブロック自体を省略し、ネストを浅くする代替アプローチ |
default(switch/match内) | いずれのケースにも合致しない場合の処理 | switchやmatch構文におけるelseに相当する役割 |
よくある落とし穴(注意点)
elseは単独では使えないelseは必ずif(またはelseif)の直後に続ける必要があり、単体の制御構造として存在することはできません。- 深いネストを生み出す原因になりやすい
if–elseを何重にも入れ子にすると、コードが非常に読みにくくなります。ガード節(早期リターン)のパターンを使うことで、else自体が不要になり、ネストを浅く保てる場合が多くあります(例4・例7を参照)。 - 単純な値の選択には
else付きのifが冗長になることがある 「条件によって変数に代入する値を変えるだけ」のような単純なケースでは、if–elseよりも三項演算子(?:)を使った方が、コードが簡潔になります(例6を参照)。 - ネストした
if–elseはelseifで整理できるelseの中に新たなif–elseを書くパターンは、多くの場合elseifを使うことで、インデントの深さを1段階減らし、読みやすく書き換えられます(例5を参照)。 - 代替構文(コロン構文)での閉じ方を間違えない HTMLテンプレート内でよく使われる
if (...): ... else: ... endif;という代替構文では、elseの後にもコロン(:)が必要です。中括弧構文の感覚でelse {のように書いてしまうと構文エラーになります(例3を参照)。
まとめ
| 観点 | まとめ |
|---|---|
| 何をする構文か | if/elseifの条件がすべてfalseだった場合に実行される処理を定義する |
| 主な用途 | 条件に合致しない場合のデフォルト処理、エラーメッセージの表示 |
| 単独使用 | 不可。必ずif(またはelseif)と組み合わせて使う |
| 省略の検討 | ガード節(早期リターン)を使うことで、else自体を省略しコードを簡潔にできる場合が多い |
| 注意点 | 深いネストを招きやすいこと、単純な値選択には三項演算子の方が適する場合があること |
else は、if と対になる基本的な制御構造ですが、「本当に必要か」を常に意識することが、読みやすいコードを書く上で重要です。ガード節による早期リターンや、三項演算子への置き換えを検討することで、else に頼りすぎない、見通しの良いコード設計を心がけましょう。
