PHPの条件分岐とは、条件に応じて実行する処理を切り替えるための仕組みです。
たとえば、WebサイトやWebアプリでは、次のような場面で条件分岐が使われます。
- ログインしているユーザーだけにマイページを表示する
- 入力フォームに不備がある場合にエラーメッセージを表示する
- 商品の在庫がある場合だけ購入ボタンを表示する
- ユーザーの権限によって管理画面の表示内容を変える
- 会員ランクによって表示する特典を切り替える
PHPで動的なWebサイトを作る場合、条件分岐はほぼ必ず使う基本文法です。
たとえば、次のコードでは、年齢が18歳以上かどうかによって処理を分けています。
$age = 20;
if ($age >= 18) {
echo "18歳以上です";
}
この例では、$age >= 18 が条件です。
$age の値が18以上であれば条件が成り立ち、echo "18歳以上です"; が実行されます。
一方、条件を満たさない場合は、if 文の中の処理は実行されません。
PHPで使う主な条件分岐
PHPでよく使う条件分岐には、主に次のようなものがあります。
| 条件分岐 | 主な用途 |
|---|---|
if | 条件が成り立つ場合だけ処理を実行する |
if...else | 条件が成り立つ場合と成り立たない場合で処理を分ける |
if...elseif...else | 複数の条件を順番に判定する |
switch | 1つの値に対して複数の分岐を作る |
| 三項演算子 | 簡単な条件分岐を1行で書く |
| null合体演算子 | 値が存在しない場合の初期値を指定する |
match | PHP 8.0以降で使える、より厳密な分岐を書く |
それぞれの使い方を詳しく見ていきましょう。
if文
if 文は、PHPの条件分岐でもっとも基本的な書き方です。
条件が成り立つ場合だけ、指定した処理を実行します。
if文の基本構文
if (条件式) {
条件がtrueの場合に実行する処理;
}
if の後ろにある丸括弧 () の中に条件式を書きます。
そして、波括弧 {} の中に、条件が成り立ったときに実行したい処理を書きます。
if文の使用例
$score = 80;
if ($score >= 60) {
echo "合格です";
}
この場合、$score は80です。
$score >= 60 という条件が成り立つため、次のように表示されます。
合格です
一方、次のように $score が50の場合は条件を満たしません。
$score = 50;
if ($score >= 60) {
echo "合格です";
}
この場合、if 文の中の処理は実行されないため、何も表示されません。
if…else文
if...else 文は、条件が成り立つ場合と成り立たない場合で処理を分けたいときに使います。
if だけでは「条件を満たす場合」の処理しか書けませんが、else を使うことで「条件を満たさない場合」の処理も書けます。
if…else文の基本構文
if (条件式) {
条件がtrueの場合の処理;
} else {
条件がfalseの場合の処理;
}
else は「それ以外の場合」という意味です。
つまり、if の条件に当てはまらなかった場合に、else の中の処理が実行されます。
if…else文の使用例
$score = 45;
if ($score >= 60) {
echo "合格です";
} else {
echo "不合格です";
}
この場合、$score は45です。
$score >= 60 という条件は成り立たないため、else の中の処理が実行されます。
不合格です
このように、条件に当てはまる場合と当てはまらない場合で処理を分けたいときは、if...else 文を使います。
if…elseif…else文
if...elseif...else 文は、複数の条件を順番に判定したいときに使います。
たとえば、点数によって評価をA、B、C、Dに分けたい場合などに便利です。
if…elseif…else文の基本構文
if (条件式1) {
条件式1がtrueの場合の処理;
} elseif (条件式2) {
条件式2がtrueの場合の処理;
} elseif (条件式3) {
条件式3がtrueの場合の処理;
} else {
どの条件にも当てはまらない場合の処理;
}
elseif は、最初の if の条件に当てはまらなかった場合に、次の条件を判定するために使います。
if…elseif…else文の使用例
$score = 75;
if ($score >= 90) {
echo "評価はAです";
} elseif ($score >= 70) {
echo "評価はBです";
} elseif ($score >= 50) {
echo "評価はCです";
} else {
echo "評価はDです";
}
この場合、$score は75です。
最初の $score >= 90 は成り立ちませんが、次の $score >= 70 は成り立ちます。
そのため、次のように表示されます。
評価はBです
elseifは上から順番に判定される
elseif を使うときに重要なのは、条件が上から順番に判定されるという点です。
たとえば、次のコードを見てください。
$score = 95;
if ($score >= 50) {
echo "C以上です";
} elseif ($score >= 70) {
echo "B以上です";
} elseif ($score >= 90) {
echo "Aです";
}
この場合、$score は95なので、本来は「Aです」と表示したいかもしれません。
しかし、最初の $score >= 50 が成り立ってしまうため、そこで処理が実行されます。
その後の elseif は判定されません。
結果は次のようになります。
C以上です
このようなミスを防ぐには、条件の順番に注意する必要があります。
点数の評価のようなケースでは、次のように高い点数から順番に判定すると自然です。
$score = 95;
if ($score >= 90) {
echo "Aです";
} elseif ($score >= 70) {
echo "Bです";
} elseif ($score >= 50) {
echo "Cです";
} else {
echo "Dです";
}
複数の条件を扱うときは、優先度の高い条件や範囲の狭い条件から先に書くのが基本です。
比較演算子
条件分岐では、値を比較するために比較演算子をよく使います。
比較演算子を使うことで、「値が同じか」「値が大きいか」「値が小さいか」などを判定できます。
よく使う比較演算子
| 演算子 | 意味 | 例 |
|---|---|---|
== | 値が等しい | $a == $b |
=== | 値と型が等しい | $a === $b |
!= | 値が等しくない | $a != $b |
!== | 値または型が等しくない | $a !== $b |
> | より大きい | $a > $b |
< | より小さい | $a < $b |
>= | 以上 | $a >= $b |
<= | 以下 | $a <= $b |
== と === の違い
PHPでは、== と === の違いに注意が必要です。
== は、値が等しいかどうかを比較します。
ただし、型が違う場合でも、PHPが自動的に型を変換して比較することがあります。
var_dump(10 == "10");
この場合、数値の 10 と文字列の "10" は、値としては同じとみなされます。
結果は次のようになります。
bool(true)
一方、=== は、値だけでなく型も含めて比較します。
var_dump(10 === "10");
この場合、数値の 10 と文字列の "10" は、値は似ていますが型が異なります。
そのため、結果は次のようになります。
bool(false)
PHPでは、意図しない型変換によって予想外の判定になることがあります。
そのため、実務では特別な理由がなければ、== よりも ===、!= よりも !== を使うのが安全です。
論理演算子
複数の条件を組み合わせたい場合は、論理演算子を使います。
たとえば、「20歳以上かつ会員である場合」や、「管理者または編集者である場合」のような条件を作れます。
よく使う論理演算子
| 演算子 | 意味 | 例 |
|---|---|---|
&& | かつ | $a && $b |
| ` | ` | |
! | 否定 | !$a |
and | かつ | $a and $b |
or | または | $a or $b |
PHPには and や or もありますが、&& や || とは優先順位が異なります。
そのため、初心者向けのコードでは、基本的に &&、||、! を使うとわかりやすく安全です。
&&を使った条件分岐
&& は「かつ」を表します。
複数の条件がすべて成り立つ場合に true になります。
$age = 25;
$isMember = true;
if ($age >= 20 && $isMember === true) {
echo "会員向けページを表示します";
}
このコードでは、次の2つの条件を判定しています。
$age >= 20
$isMember === true
両方の条件が成り立つ場合だけ、if 文の中の処理が実行されます。
||を使った条件分岐
|| は「または」を表します。
複数の条件のうち、1つでも成り立てば true になります。
$role = "admin";
if ($role === "admin" || $role === "editor") {
echo "管理画面にアクセスできます";
}
この場合、$role が "admin" または "editor" であれば、処理が実行されます。
ユーザー権限の判定などでよく使われる書き方です。
!を使った条件分岐
! は、条件を反転させる演算子です。
$isLoggedIn = false;
if (!$isLoggedIn) {
echo "ログインしてください";
}
$isLoggedIn は false ですが、!$isLoggedIn と書くことで判定が反転し、true として扱われます。
そのため、次のように表示されます。
ログインしてください
「ログインしていない場合」「値が存在しない場合」「条件を満たしていない場合」などを表現するときによく使います。
switch文
switch 文は、1つの値に対して複数の分岐を作りたいときに使います。
たとえば、曜日、会員ランク、ステータス、カテゴリーなど、決まった値ごとに処理を分けたい場合に便利です。
switch文の基本構文
switch (値) {
case 値1:
処理1;
break;
case 値2:
処理2;
break;
default:
どのcaseにも当てはまらない場合の処理;
break;
}
switch の中に判定したい値を書きます。
そして、case ごとに一致した場合の処理を書きます。
どの case にも当てはまらない場合は、default の処理が実行されます。
switch文の使用例
$day = "月曜日";
switch ($day) {
case "月曜日":
echo "週の始まりです";
break;
case "金曜日":
echo "週末が近いです";
break;
case "土曜日":
case "日曜日":
echo "休日です";
break;
default:
echo "通常の日です";
break;
}
この場合、$day が "月曜日" なので、次のように表示されます。
週の始まりです
また、次のように複数の case で同じ処理を実行することもできます。
case "土曜日":
case "日曜日":
echo "休日です";
break;
この書き方を使うと、土曜日と日曜日をまとめて「休日」として扱えます。
switch文ではbreakを書き忘れない
switch 文では、基本的に各 case の最後に break を書きます。
break を書かないと、次の case の処理まで続けて実行されることがあります。
$color = "red";
switch ($color) {
case "red":
echo "赤です";
case "blue":
echo "青です";
default:
echo "その他です";
}
この場合、$color は "red" なので「赤です」だけが表示されそうに見えます。
しかし、break がないため、後続の処理まで続けて実行されます。
赤です青ですその他です
意図しない動作を防ぐため、通常は次のように break を書きます。
$color = "red";
switch ($color) {
case "red":
echo "赤です";
break;
case "blue":
echo "青です";
break;
default:
echo "その他です";
break;
}
switch文は緩い比較を行う
switch 文を使うときは、比較の仕組みにも注意が必要です。
PHPの switch は、=== のような厳密比較ではなく、緩い比較に近い判定を行います。
そのため、次のようなコードでは注意が必要です。
$value = "1";
switch ($value) {
case 1:
echo "数値の1です";
break;
case "1":
echo "文字列の1です";
break;
}
$value は文字列の "1" ですが、switch では緩い比較が行われるため、先に書かれた case 1 に一致することがあります。
型まで厳密に判定したい場合は、PHP 8.0以降で使える match を検討するとよいでしょう。
三項演算子
三項演算子は、簡単な if...else を1行で書ける構文です。
短い条件分岐をすっきり書きたいときに便利です。
三項演算子の基本構文
条件式 ? trueの場合の値 : falseの場合の値;
条件式が true の場合は : の左側の値が使われ、false の場合は : の右側の値が使われます。
三項演算子の使用例
$age = 18;
$message = ($age >= 18) ? "18歳以上です" : "18歳未満です";
echo $message;
この場合、$age >= 18 が成り立つため、$message には "18歳以上です" が代入されます。
同じ処理を if...else で書くと、次のようになります。
$age = 18;
if ($age >= 18) {
$message = "18歳以上です";
} else {
$message = "18歳未満です";
}
三項演算子を使うと、単純な条件分岐を短く書けます。
三項演算子を使いすぎない
三項演算子は便利ですが、複雑な条件分岐を無理に1行で書くと読みにくくなります。
たとえば、次のような書き方は避けたほうがよいです。
$result = ($score >= 90) ? "A" : (($score >= 70) ? "B" : (($score >= 50) ? "C" : "D"));
動作はしますが、条件が複雑で読みづらくなっています。
このような場合は、次のように if...elseif...else を使ったほうがわかりやすいです。
if ($score >= 90) {
$result = "A";
} elseif ($score >= 70) {
$result = "B";
} elseif ($score >= 50) {
$result = "C";
} else {
$result = "D";
}
三項演算子は、あくまで短くて単純な条件分岐に使うのがおすすめです。
null合体演算子
null合体演算子 ?? は、値が存在しない場合や null の場合に、代わりの値を指定できる構文です。
フォーム入力やGETパラメータ、配列の値を扱うときによく使われます。
null合体演算子の基本構文
値 ?? 代替値;
左側の値が存在し、かつ null でなければ左側の値を使います。
左側の値が存在しない場合や null の場合は、右側の代替値を使います。
null合体演算子の使用例
$name = $_GET['name'] ?? 'ゲスト';
echo $name;
このコードでは、$_GET['name'] が存在すればその値を使います。
存在しない場合は、'ゲスト' を使います。
同じ処理を isset() を使って書くと、次のようになります。
if (isset($_GET['name'])) {
$name = $_GET['name'];
} else {
$name = 'ゲスト';
}
?? を使うと、初期値を設定する処理を短く書けます。
null合体演算子の注意点
?? は、値が null または存在しない場合に右側の値を使います。
$username = null;
echo $username ?? '未設定';
この場合、$username は null なので、次のように表示されます。
未設定
一方で、空文字 "" や数値の 0 は null ではありません。
$count = 0;
echo $count ?? 10;
この場合、$count は 0 ですが、null ではないため、0 が表示されます。
0
「空文字も未入力として扱いたい」「0も未設定として扱いたい」という場合は、?? だけではなく、別の判定が必要です。
match式
match は、PHP 8.0以降で使える条件分岐です。
switch に似ていますが、より厳密で、値を返す分岐を書きやすいという特徴があります。
match式の基本構文
$result = match (値) {
条件1 => 結果1,
条件2 => 結果2,
条件3 => 結果3,
default => デフォルトの結果,
};
match は式なので、結果を変数に代入できます。
また、switch のように break を書く必要がありません。
match式の使用例
$status = 200;
$message = match ($status) {
200 => '成功しました',
404 => 'ページが見つかりません',
500 => 'サーバーエラーです',
default => '不明なステータスです',
};
echo $message;
この場合、$status は200なので、次のように表示されます。
成功しました
match式は厳密に比較される
match は、switch と違って厳密な比較を行います。
つまり、値だけでなく型も含めて判定されます。
$value = "1";
$result = match ($value) {
1 => '数値の1です',
"1" => '文字列の1です',
};
echo $result;
この場合、$value は文字列の "1" です。
match では厳密に比較されるため、数値の 1 ではなく、文字列の "1" に一致します。
結果は次のようになります。
文字列の1です
型の違いを明確に扱いたい場合は、switch よりも match のほうが安全です。
match式ではdefaultを書くと安全
match では、どの条件にも一致せず、default もない場合にエラーになります。
そのため、想定外の値が入る可能性がある場合は、default を書いておくと安全です。
$status = 403;
$message = match ($status) {
200 => '成功しました',
404 => 'ページが見つかりません',
500 => 'サーバーエラーです',
default => '不明なステータスです',
};
このように default を用意しておけば、想定していない値が入っても処理できます。
条件式でよく使う関数
PHPの条件分岐では、比較演算子だけでなく、関数を使って条件を判定することもよくあります。
ここでは、条件分岐と一緒に使われる代表的な関数を紹介します。
isset
isset() は、変数が存在し、かつ null ではないかを確認する関数です。
issetの使用例
$name = "田中";
if (isset($name)) {
echo "名前が設定されています";
}
この場合、$name には "田中" が入っているため、isset($name) は true になります。
フォームや配列の値を確認するときにもよく使われます。
if (isset($_POST['email'])) {
echo "メールアドレスが送信されました";
}
ただし、単純に初期値を設定したいだけであれば、現在では null合体演算子 ?? を使うことも多いです。
$email = $_POST['email'] ?? '';
empty
empty() は、変数が空かどうかを判定する関数です。
正確には、変数が存在しない場合、または値が false と同等に扱われる場合に true を返します。
emptyの使用例
$name = "";
if (empty($name)) {
echo "名前が入力されていません";
}
この場合、$name は空文字なので、empty($name) は true になります。
emptyで空として扱われる値
empty() では、主に次のような値が空として扱われます。
| 値 | emptyの判定 |
|---|---|
"" | true |
"0" | true |
0 | true |
0.0 | true |
null | true |
false | true |
[] | true |
特に注意したいのは、文字列の "0" も empty() では空として扱われる点です。
$value = "0";
if (empty($value)) {
echo "空です";
}
この場合、"0" は空として扱われるため、次のように表示されます。
空です
価格、数量、評価値などで "0" を有効な値として扱いたい場合は、empty() だけに頼らないほうが安全です。
たとえば、空文字だけを未入力として扱いたい場合は、次のように書けます。
$value = "0";
if ($value === '') {
echo "未入力です";
} else {
echo "入力されています";
}
この場合、$value は "0" なので、未入力ではなく「入力されています」と判定できます。
is_null
is_null() は、値が null かどうかを判定する関数です。
is_nullの使用例
$value = null;
if (is_null($value)) {
echo "値はnullです";
}
このコードでは、$value が null なので、if 文の中の処理が実行されます。
同じ意味の処理は、厳密比較を使って次のように書くこともできます。
if ($value === null) {
echo "値はnullです";
}
実務では、is_null($value) よりも $value === null のように書かれることも多いです。
どちらも意味はほぼ同じですが、プロジェクトのコーディングルールに合わせて使い分けるとよいでしょう。
in_array
in_array() は、配列の中に指定した値が含まれているかを判定する関数です。
ユーザー権限、ステータス、カテゴリーなどを判定するときによく使われます。
in_arrayの使用例
$role = "editor";
$allowedRoles = ["admin", "editor"];
if (in_array($role, $allowedRoles, true)) {
echo "アクセスできます";
}
この場合、$role の値である "editor" が $allowedRoles の中に含まれているため、処理が実行されます。
in_arrayでは第3引数にtrueを指定すると安全
in_array() の第3引数に true を指定すると、型も含めて厳密に比較されます。
in_array($role, $allowedRoles, true)
第3引数を省略すると、緩い比較になるため、意図しない値が一致してしまう可能性があります。
そのため、実務では基本的に第3引数に true を指定するのがおすすめです。
条件分岐の実用例
ここからは、PHPの条件分岐が実際にどのような場面で使われるのかを紹介します。
ログイン判定
ログイン状態によって表示内容を変える処理は、条件分岐の代表的な使い方です。
$isLoggedIn = true;
if ($isLoggedIn) {
echo "マイページへようこそ";
} else {
echo "ログインしてください";
}
実際のWebアプリでは、セッション情報を使ってログイン状態を判定することが多いです。
session_start();
if (isset($_SESSION['user_id'])) {
echo "ログイン中です";
} else {
echo "ログインしてください";
}
$_SESSION['user_id'] が存在する場合はログイン中、存在しない場合は未ログインとして扱う例です。
フォーム入力のチェック
フォームから送信された値をチェックするときにも、条件分岐をよく使います。
$email = $_POST['email'] ?? '';
if ($email === '') {
echo "メールアドレスを入力してください";
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "正しいメールアドレスを入力してください";
} else {
echo "メールアドレスは有効です";
}
この例では、まずメールアドレスが空かどうかを確認しています。
空でなければ、filter_var() を使ってメールアドレスの形式が正しいかどうかを判定しています。
ユーザー入力を出力するときはエスケープする
フォーム入力の値をHTMLに出力する場合は、セキュリティにも注意が必要です。
ユーザーが入力した値をそのまま画面に表示すると、XSSと呼ばれる攻撃につながる可能性があります。
そのため、ユーザー入力をHTMLに出力するときは、htmlspecialchars() などでエスケープします。
$name = $_POST['name'] ?? '';
echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
条件分岐そのものとは別の話ですが、PHPでフォームを扱う場合は重要なポイントです。
在庫の有無で表示を変える
ECサイトでは、在庫数によって表示するメッセージやボタンを切り替えることがあります。
$stock = 5;
if ($stock > 0) {
echo "在庫あり";
} else {
echo "売り切れ";
}
在庫がある場合だけ購入ボタンを表示したい場合は、次のように書けます。
$stock = 0;
if ($stock > 0) {
echo '<button>購入する</button>';
} else {
echo '<p>現在売り切れです</p>';
}
このように、条件分岐を使うことで、状況に応じた表示を作れます。
会員ランクによる分岐
会員ランクやユーザーステータスのように、決まった値ごとに処理を分ける場合は、switch や match が便利です。
switchを使った会員ランクの分岐
$rank = "gold";
switch ($rank) {
case "gold":
echo "ゴールド会員向けの特典を表示します";
break;
case "silver":
echo "シルバー会員向けの特典を表示します";
break;
case "bronze":
echo "ブロンズ会員向けの特典を表示します";
break;
default:
echo "通常会員向けの内容を表示します";
break;
}
$rank の値に応じて、表示する内容を切り替えています。
matchを使った会員ランクの分岐
PHP 8.0以降であれば、match を使って次のように書くこともできます。
$rank = "gold";
$message = match ($rank) {
"gold" => "ゴールド会員向けの特典を表示します",
"silver" => "シルバー会員向けの特典を表示します",
"bronze" => "ブロンズ会員向けの特典を表示します",
default => "通常会員向けの内容を表示します",
};
echo $message;
match は結果を変数に代入しやすく、break も不要です。
また、比較が厳密に行われるため、型の違いによる予期しない判定を避けやすくなります。
HTMLの中で条件分岐を書く方法
PHPはHTMLの中に埋め込んで使うことが多いため、HTMLと条件分岐を組み合わせる場面もよくあります。
通常の書き方
<?php $isLoggedIn = true; ?>
<?php if ($isLoggedIn) { ?>
<p>ログイン中です</p>
<?php } else { ?>
<p>ログインしてください</p>
<?php } ?>
この書き方でも問題なく動作します。
ただし、HTMLが多くなると、波括弧 {} の対応関係がわかりにくくなることがあります。
代替構文を使った書き方
PHPでは、HTML内で読みやすく書くために、次のような代替構文を使うこともできます。
<?php $isLoggedIn = true; ?>
<?php if ($isLoggedIn): ?>
<p>ログイン中です</p>
<?php else: ?>
<p>ログインしてください</p>
<?php endif; ?>
代替構文では、{} の代わりに : と endif; を使います。
HTMLテンプレートの中では、どこで if 文が終わるのかがわかりやすくなるため、読みやすいコードになります。
elseifを使う場合の代替構文
elseif を使う場合も、同じように書けます。
<?php if ($rank === "gold"): ?>
<p>ゴールド会員です</p>
<?php elseif ($rank === "silver"): ?>
<p>シルバー会員です</p>
<?php else: ?>
<p>通常会員です</p>
<?php endif; ?>
PHPとHTMLを混在させるテンプレートでは、この代替構文がよく使われます。
条件分岐で注意すべきポイント
PHPの条件分岐では、書き方によって意図しない判定になることがあります。
ここでは、特に注意したいポイントを紹介します。
できるだけ厳密比較を使う
PHPでは、== を使うと型変換が行われることがあります。
if (0 == "0") {
echo "同じです";
}
この場合、数値の 0 と文字列の "0" は、緩い比較では同じとみなされます。
一方、=== を使うと、値だけでなく型も比較されます。
if (0 === "0") {
echo "同じです";
} else {
echo "違います";
}
この場合、数値と文字列で型が違うため、次のように表示されます。
違います
実務では、意図しない型変換を避けるため、基本的に === や !== を使うのがおすすめです。
条件を複雑にしすぎない
条件分岐は便利ですが、1つの if 文に多くの条件を詰め込みすぎると、コードが読みにくくなります。
if ($user['age'] >= 20 && $user['status'] === 'active' && $user['role'] === 'admin' && $user['email_verified'] === true) {
echo "管理者として利用できます";
}
このコードでも動作はしますが、条件が長く、何を判定しているのかがわかりにくくなっています。
このような場合は、条件を意味のある変数に分けると読みやすくなります。
$isAdult = $user['age'] >= 20;
$isActive = $user['status'] === 'active';
$isAdmin = $user['role'] === 'admin';
$isEmailVerified = $user['email_verified'] === true;
if ($isAdult && $isActive && $isAdmin && $isEmailVerified) {
echo "管理者として利用できます";
}
条件に名前を付けることで、コードの意図がわかりやすくなります。
ネストを深くしすぎない
条件分岐を何重にも入れ子にすると、コードが読みにくくなります。
if ($isLoggedIn) {
if ($isAdmin) {
if ($isActive) {
echo "管理画面を表示します";
}
}
}
このようなコードは、条件が増えるほど理解しづらくなります。
関数の中であれば、条件を満たさないケースを先に返すことで、ネストを浅くできます。
function getAdminPageMessage($isLoggedIn, $isAdmin, $isActive)
{
if (!$isLoggedIn) {
return "ログインしてください";
}
if (!$isAdmin) {
return "権限がありません";
}
if (!$isActive) {
return "アカウントが有効ではありません";
}
return "管理画面を表示します";
}
このように、先に例外的なケースを処理すると、コードの流れが読みやすくなります。
elseを使いすぎない
else は便利ですが、必ず使わなければならないわけではありません。
たとえば、関数の中では次のように書けます。
function getResultMessage($score)
{
if ($score >= 60) {
return "合格です";
}
return "不合格です";
}
if の中で return しているため、else を書かなくても処理を分けられます。
このような書き方をすると、コードがすっきりします。
andとorの優先順位に注意する
PHPには、論理演算子として and や or もあります。
ただし、and や or は && や || と優先順位が異なるため、初心者にはわかりづらいことがあります。
たとえば、次のようなコードは直感と異なる結果になる場合があります。
$result = true and false;
このコードは、and よりも代入演算子 = のほうが優先されます。
そのため、$result には true が代入されます。
混乱を避けるため、通常の条件分岐では次のように && や || を使うほうがわかりやすいです。
if ($isLoggedIn && $isAdmin) {
echo "管理画面を表示します";
}
条件分岐と真偽値の扱い
PHPでは、条件式には true や false だけでなく、さまざまな値を直接書くことができます。
たとえば、次のようなコードです。
$name = "田中";
if ($name) {
echo "名前があります";
}
この場合、$name には空ではない文字列が入っているため、true のように扱われます。
PHPでfalseとして扱われる値
PHPでは、次のような値が false として扱われます。
| 値 | 判定 |
|---|---|
false | false |
0 | false |
0.0 | false |
"" | false |
"0" | false |
[] | false |
null | false |
特に注意したいのは、文字列の "0" も false として扱われる点です。
文字列の”0″に注意する
次のコードを見てください。
$price = "0";
if ($price) {
echo "価格が設定されています";
} else {
echo "価格が未設定です";
}
この場合、$price には文字列の "0" が入っています。
しかし、PHPでは "0" は false として扱われるため、else 側の処理が実行されます。
価格が未設定です
価格として "0" を有効な値として扱いたい場合、この判定は適切ではありません。
次のように、何を未入力とみなすのかを明確にして判定する必要があります。
$price = "0";
if ($price !== '') {
echo "価格が設定されています";
} else {
echo "価格が未設定です";
}
この場合、$price は空文字ではないため、次のように表示されます。
価格が設定されています
条件分岐を書くときは、「PHPがどう判定するか」だけでなく、「自分が何を空とみなしたいか」を明確にすることが大切です。
条件分岐を使い分ける目安
PHPには複数の条件分岐の書き方があります。
どれを使えばよいか迷った場合は、次のように考えるとわかりやすいです。
| 使いたい場面 | おすすめの構文 |
|---|---|
| 条件を1つだけ判定したい | if |
| 条件が成り立つ場合と成り立たない場合を分けたい | if...else |
| 複数の条件を順番に判定したい | if...elseif...else |
| 1つの値に対して複数パターンを分けたい | switch |
| PHP 8.0以降で厳密な分岐を書きたい | match |
| 短い条件分岐を1行で書きたい | 三項演算子 |
| 値がなければ初期値を入れたい | null合体演算子 ?? |
ifが向いているケース
単純に1つの条件だけを判定したい場合は、if が向いています。
if ($isLoggedIn) {
echo "ログイン中です";
}
if…elseが向いているケース
条件を満たす場合と満たさない場合の両方に処理がある場合は、if...else が向いています。
if ($stock > 0) {
echo "在庫あり";
} else {
echo "売り切れ";
}
if…elseif…elseが向いているケース
点数や金額など、複数の条件を順番に判定する場合は、if...elseif...else が向いています。
if ($score >= 90) {
echo "A";
} elseif ($score >= 70) {
echo "B";
} elseif ($score >= 50) {
echo "C";
} else {
echo "D";
}
switchが向いているケース
1つの値に対して、複数のパターンを分けたい場合は、switch が向いています。
switch ($status) {
case "published":
echo "公開中";
break;
case "draft":
echo "下書き";
break;
default:
echo "不明な状態";
break;
}
ただし、switch は緩い比較を行うため、型の違いに注意が必要です。
matchが向いているケース
PHP 8.0以降で、値を返す分岐を簡潔に書きたい場合や、厳密な比較をしたい場合は、match が向いています。
$statusLabel = match ($status) {
"published" => "公開中",
"draft" => "下書き",
default => "不明な状態",
};
match は break が不要で、結果を変数に代入しやすいのが特徴です。
PHPの条件分岐まとめ
PHPの条件分岐は、条件に応じて処理を切り替えるための基本文法です。
もっとも基本となるのは if 文です。
条件が成り立つ場合だけ処理したいときは if、条件が成り立たない場合の処理も書きたいときは if...else を使います。
複数の条件を順番に判定したい場合は、if...elseif...else が便利です。
点数の評価、料金プラン、ユーザーステータスなど、条件の範囲がある場合によく使われます。
1つの値に対して複数のパターンを分ける場合は、switch や match が使えます。
ただし、switch は緩い比較を行うため、型の違いに注意が必要です。
PHP 8.0以降であれば、より厳密に比較できる match を使う選択肢もあります。
また、PHPでは == と ===、empty()、"0" の真偽値判定など、型変換に関する注意点があります。
実務では、意図しない判定を避けるため、できるだけ === や !== を使い、何を条件として判定したいのかを明確に書くことが大切です。
条件分岐は、PHPの中でも特に使用頻度の高い文法です。基本構文だけでなく、比較演算子や論理演算子、PHP特有の真偽値の扱いまで理解しておくと、より安全で読みやすいコードを書けるようになります。
以上、PHPの条件分岐についてでした。
最後までお読みいただき、ありがとうございました。










