【PHP】if文による条件分岐|比較演算子・論理演算子・真偽値の落とし穴

PHPの if 文は、条件によって処理を分けるための基本構文です。使い方自体はシンプルですが、条件式に使う比較演算子(=====)の違い「0」や空文字が偽として扱われるといった落とし穴を知らないとバグになります。この記事では基本から、つまずきやすいポイントまで解説します。

この記事の結論:基本は if (条件) { ... } elseif (...) { ... } else { ... }。等価判定は型まで見る === を基本に(== は緩い比較で誤判定する)。if ($var) では 0・空文字・null なども偽になる点に注意します。
スポンサーリンク

if・else・elseifの基本

if / elseif / else
<?php
$score = 85;

if ($score >= 90) {
    echo "Excellent!";
} elseif ($score >= 70) {
    echo "Good!";        // ← これが実行される
} else {
    echo "Need improvement!";
}

elseif は上から順に評価され、最初にtrueになった分岐だけが実行されます。どれにも当てはまらないときは else が実行されます。

条件式で使う比較演算子

演算子 意味
== 等しい(型を区別しない=緩い比較)
=== 等しい(型も一致=厳密比較)
!= / !== 等しくない(緩い / 厳密)
< > <= >= 大小比較
等価判定は === を基本にしましょう。== は型を区別しない緩い比較で、想定外の一致を招きます。たとえばPHP 7では 0 == "abc"true でした(PHP 8では false に修正)。型まで含めて確実に判定するなら === です。
== と === の違い
<?php
var_dump("1" == 1);   // true(緩い比較。型を無視)
var_dump("1" === 1);  // false(厳密比較。文字列と数値は別物)

複数条件をつなぐ論理演算子

複数の条件を組み合わせるには &&(かつ)・||(または)・!(否定)を使います。&&||短絡評価で、左で結果が確定すると右は評価されません。

&& / || / !
<?php
$age = 25;
$hasTicket = true;

if ($age >= 18 && $hasTicket) {
    echo "入場できます";
}

// 短絡評価: $user が null なら右側を評価しない(エラー回避)
if ($user !== null && $user->isActive()) {
    echo "有効なユーザー";
}

注意:条件式での真偽値(truthy / falsy)

if ($var) のように値だけを条件にすると、PHPはそれを真偽値に変換します。次の値はすべて「偽(falsy)」になる点に注意してください。

  • false / null
  • 00.0(数値のゼロ)
  • ""(空文字)、"0"(文字列のゼロ)
  • [](空配列)
文字列 "0" が偽になるのは特に要注意です。たとえばユーザーが「0」と入力した場合、if ($input) は偽になり、「未入力」と誤判定します。「入力があるか」を見たいなら if ($input !== "") のように明示的に比較しましょう。

三項演算子とnull合体演算子で短く書く

単純な分岐は三項演算子 ?:で1行に書けます。「未定義・nullなら既定値」ならnull合体演算子 ??が便利です。

三項演算子と ??
<?php
// 三項演算子
$message = ($age >= 18) ? "投票できます" : "投票できません";

// 短縮三項(左が真ならその値、偽なら右)
$name = $inputName ?: "名無し";

// null合体: 未定義/null なら既定値(警告も出ない)
$name = $_GET["name"] ?? "ゲスト";
?: は「偽なら右」、?? は「null/未定義なら右」です。0 や空文字でも右を使いたいなら ?:、null・未定義のときだけ右を使いたいなら ?? と使い分けます。

よくある質問(FAQ)

Q== と === はどちらを使うべきですか?
A基本は ===(厳密比較)です。== は型を区別しない緩い比較で、"1" == 1 が真になるなど想定外の一致を招きます。型まで含めて確実に判定したいなら === を使ってください。
Qif ($var) で「0」が未入力扱いされます。
A文字列 "0" も偽(falsy)だからです。値が入力されているかを見たいなら if ($var !== "")if (isset($var)) のように明示的に判定してください。
Q?: と ?? の違いは?
A?:(短縮三項)は左が偽(0や空文字も含む)なら右を返します。??(null合体)は左がnullまたは未定義のときだけ右を返します。0 や空文字を有効値として扱いたいなら ?? が安全です。
Q分岐が多いときはif文以外に何がありますか?
A1つの値を多くの候補と比べるなら switch 文、PHP 8.0以降なら match 式も使えます。詳しくはswitch文の使い方を参照してください。

まとめ

PHPのif文のポイントを整理します。

  • 基本は if / elseif / else(最初にtrueの分岐だけ実行)
  • 等価判定は===(厳密)を基本に(== は誤判定の元)
  • 複数条件は && / || / !(短絡評価)
  • if ($var) では 0"0"・空文字・null[] が偽
  • 短く書くなら ?:(偽なら右)/ ??(null・未定義なら右)

関連として、switch文の使い方strcmpで文字列を比較する方法ループ処理を行う方法もあわせて読むと、PHPの制御構造に強くなれます。