PHPでプログラミングを行う際、条件分岐はプログラムの挙動を制御するための最も基本的な要素の一つです。
ユーザーの入力内容やデータベースから取得した値に応じて、実行する処理を切り替えるために使用されます。
初心者の方にとって、まずはif文をマスターすることが第一歩となります。
しかし、近年のPHP開発では、より簡潔で安全に記述できるmatch式などの新しい構文も頻繁に利用されています。
本記事では、PHPにおける条件分岐の基本から、実務で役立つ応用的なテクニックまでを詳しく紹介します。
PHPにおける条件分岐の基本:if文
条件分岐の中で最も汎用性が高く、頻繁に利用されるのがif文です。
if文は、指定した条件が「真(true)」である場合にのみ、特定の処理を実行します。
基本的な構文は、ifの後の括弧内に条件式を記述し、その後の波括弧内に処理を記述する形となります。
<?php
$score = 85;
// スコアが80以上の場合にメッセージを表示
if ($score >= 80) {
echo "合格です。おめでとうございます!";
}
?>
合格です。おめでとうございます!
elseとelseifによる複数条件の分岐
条件が一致しなかった場合の処理を追加するには、elseキーワードを使用します。
また、複数の異なる条件を順番に判定したい場合には、elseifを使用することで複雑な分岐を実現できます。
判定は上から順番に行われ、最初に条件が一致したブロックのみが実行される点に注意してください。
<?php
$hour = 15;
if ($hour < 12) {
echo "おはようございます";
} elseif ($hour < 18) {
echo "こんにちは";
} else {
echo "こんばんは";
}
?>
こんにちは
比較演算子と論理演算子の活用
条件式の中では、値を比較するために==や===などの比較演算子を使用します。
PHPでは、型まで含めて厳密に比較を行う「===」演算子を使用することが推奨されます。
また、「かつ(&&)」や「または(||)」といった論理演算子を組み合わせることで、より高度な条件設定が可能です。
簡潔な記述を可能にする三項演算子とNull合体演算子
単純な条件分岐であれば、if文を使うよりも簡潔に記述できる方法があります。
その代表的な例が三項演算子です。
三項演算子は、条件式 ? 真の場合の値 : 偽の場合の値という形式で記述します。
<?php
$age = 20;
$status = ($age >= 18) ? "成人" : "未成年";
echo $status;
?>
成人
Null合体演算子の利便性
PHP 7.0以降では、変数が未定義であったり、値がnullであったりする場合のデフォルト値を指定する??(Null合体演算子)が導入されました。
フォームの送信データやAPIからのレスポンスを扱う際に、非常に重宝する機能です。
これにより、isset()関数を記述する手間を省き、コードの視認性を大幅に向上させることができます。
<?php
// $_GET['user'] が存在しない場合は 'guest' を代入
$username = $_GET['user'] ?? 'guest';
echo "ようこそ、" . $username . "さん";
?>
複数の分岐を整理するswitch文
一つの変数に対して多くの値をチェックする場合、elseifを並べるよりもswitch文の方が読みやすくなることがあります。
switch文は、式の結果とcaseに記述された値を比較し、一致した場所から処理を開始します。
各ケースの最後には必ずbreak;を記述して、処理が次のケースへ漏れ出さないようにする必要があります。
<?php
$color = "red";
switch ($color) {
case "red":
echo "止まってください";
break;
case "yellow":
echo "注意してください";
break;
case "blue":
echo "進んでも良いです";
break;
default:
echo "信号を確認してください";
}
?>
switch文の注意点
switch文による比較は、緩やかな比較(==)で行われるという性質があります。
そのため、数値の「0」と空文字「””」が同じとみなされるなど、意図しない挙動を引き起こすリスクがあります。
より厳密な比較が求められる現代のPHP開発では、次に解説するmatch式の利用が優先される傾向にあります。
モダンなPHP開発のスタンダード:match式
PHP 8.0から導入されたmatch式は、switch文の欠点を解消した強力な構文です。
match式の最大の特徴は、厳密な比較(===)が行われることです。
また、matchは「式」であるため、処理の結果をそのまま変数に代入することが可能です。
<?php
$status_code = 200;
$message = match ($status_code) {
200, 201 => "成功しました",
400 => "リクエストが不正です",
404 => "ページが見つかりません",
default => "エラーが発生しました",
};
echo $message;
?>
成功しました
match式を利用するメリット
match式では、各条件の最後にbreak;を書く必要がありません。
これにより、書き忘れによるバグを完全に防止できるという利点があります。
また、該当する条件がなくdefaultも記述されていない場合は、エラー(UnhandledMatchError)を投げるため、想定外の値に対する検知も容易です。
条件分岐を使い分けるためのガイドライン
多種多様な条件分岐の構文をどのように使い分けるべきか、以下の表にまとめました。
| 構文 | 主な用途 | 特徴 |
|---|---|---|
| if文 | 汎用的な条件判定 | 範囲指定や複雑な論理演算が可能 |
| 三項演算子 | 単純な値の切り替え | 1行で記述でき、変数への代入に便利 |
| switch文 | 多くの値の分岐 | 古いコードとの互換性や柔軟なフォールスルー |
| match式 | 厳密な値の分岐 | 型まで含めた比較が行われ、記述が簡潔 |
実戦テクニック:ガード節によるネストの解消
複雑なロジックを記述すると、if文の中にさらにif文が入る「ネスト」が深くなりがちです。
ネストが深くなると、コードの可読性が著しく低下し、メンテナンスが困難になります。
これを防ぐための手法が「ガード節」を用いた早期リターンです。
<?php
function processOrder($order) {
// 条件を満たさない場合は先に処理を終了させる(ガード節)
if ($order === null) {
return "注文データがありません";
}
if ($order->status === 'shipped') {
return "既に発送済みです";
}
// 本来行いたいメインの処理
return "注文の処理を開始します";
}
?>
このように、例外的なケースを最初に取り除いていくことで、メインの処理をネストなしで記述できるようになります。
実務の現場では、このような「読みやすいコード」を書く技術が非常に高く評価されます。
まとめ
PHPの条件分岐には、伝統的なif文から、最新のmatch式まで多様な選択肢が用意されています。
基本となるif文を確実に理解した上で、用途に応じて三項演算子やmatch式を使い分けることが重要です。
特にPHP 8以降を利用できる環境であれば、型の安全性が保証されるmatch式の活用を積極的に検討しましょう。
また、文法を覚えるだけでなく、ガード節などのテクニックを駆使して「誰が見ても読みやすいコード」を目指すことが上達への近道です。
今回紹介したテクニックを日々の開発に取り入れ、より洗練されたPHPプログラムを構築してください。
