【PHP初心者向け】==と===の違いは「空気を読むか」だ!親切な罠「型変換」

==と=== プログラミング

「空気を読め」がシステムをダメにする

以下のif文の記事で、イコールは3回連打してくださいと書きました。

【PHP初心者向け】if文を完全攻略!「もしも」で操るプログラムの運命と無慈悲なelse
プログラムはif文を手に入れた瞬間、ただの計算機から「思考する機械」へと進化します。「もし金があれば寿司を食う、なければ寝る」。この単純にして絶対的な分岐こそがロジックの根幹。if、else、elseifでコードの流れを支配する方法を伝授します。

今日はその理由を話します。
PHPには、主に2種類の「等しい」が存在します。

  • ==(等価演算子)
  • ===(厳密等価演算子)

この1つの記号の差が、天国と地獄を分けることがあります。

結論としまして…

==は、親切すぎて迷惑な「お節介焼き」です。
===は、融通の利かない「頑固な裁判官」です。

あなたが信頼すべきは、融通の利かない頑固者の後者です。


==:空気を読みすぎるお節介

イコール2つの == は、比較するときに勝手に「型変換」を行います。

型変換とは、データの種類(数字とか文字とか)を、都合よく解釈し直す機能です。
例えば、数字の100と、文字の”100″。

プログラミング的にはこれらは別物です。
前者は計算できる数、後者はただの記号の羅列だからです。

しかし、== は気を利かせます。
「あー、これ文字だけど、中身は数字っぽいね。じゃあ同じってことにしておくよ!」

if (100 == "100") {
    echo "同じです";
}
// 結果:同じですCode language: PHP (php)

一見、便利そうです。
しかし、この優しさが牙を剥く瞬間があります。


===:見た目も中身も一致しないと許さない

一方、イコール3つの===は冷徹です。
一切の忖度をしません。

「値は同じ100だが、片方は数字で、片方は文字だ。よって別物である。却下」

if (100 === "100") {
    echo "同じです";
} else {
    echo "違います";
}
// 結果:違いますCode language: PHP (php)

これが安全な、正しい比較の姿です。

データの種類(型)まで完全に一致して初めて「等しい」と認める。
この厳格さが、予期せぬ事故を防ぎます。


恐怖の「0」問題:全部同じに見える罠

なぜ == が危険なのか。
それは、PHPが「0っぽいもの」をすべて同じとみなす癖があるからです。

以下のリストを見てください。

  • 0 (数字のゼロ)
  • "0" (文字のゼロ)
  • "" (空っぽの文字)
  • false (偽)
  • null (無)

== を使うと、これらは状況によって「互いに等しい」と判定されることがあります。

例えば、レアケースでしょうが会員番号が「0番」のユーザーがいたとします。
ログイン処理で「ユーザーが見つからなかったら(falseなら)エラー」というコードを書いたとしましょう。

// 悪い例
if ($user_id == false) {
    echo "ログイン失敗";
}Code language: PHP (php)

ここで会員番号 0 がやってくると、PHPはこう判断します。

「0?まあfalseと似たようなもんだろ。よし、ログイン失敗!」

正規の会員なのに、門前払いされます。これが「型変換」の恐ろしさです。

===を使っていれば、0false「0は0、falseはfalseだ。この2つは同じと認めることはできん。よって等しくはない!」と明確に区別されるため、この悲劇は起きません。


まとめ:キーボードが壊れてでも3回叩くべし

プログラミングにおいて、曖昧さは敵です。
「なんとなく同じ」は、バグの温床です。

  • ==:使わずに封印。
  • ===: 常にこれを使う。

=を押す回数が1回増えるのはもしかしたら大変かもしれません。
しかし、その1回のタイプを惜しんで、将来の数時間をデバッグ(修正作業)に費やすよりマシです。

「値が等しいか」を確認したいときは、迷わずイコールを3回連打してください。

比較する時は厳密に、の精神を初心者のうちに覚えちゃいましょう。

それが、あなたのコードの守り神となります。

コメント

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