「空気を読め」がシステムをダメにする
以下のif文の記事で、イコールは3回連打してくださいと書きました。

今日はその理由を話します。
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と似たようなもんだろ。よし、ログイン失敗!」
正規の会員なのに、門前払いされます。これが「型変換」の恐ろしさです。
===を使っていれば、0とfalseは「0は0、falseはfalseだ。この2つは同じと認めることはできん。よって等しくはない!」と明確に区別されるため、この悲劇は起きません。
まとめ:キーボードが壊れてでも3回叩くべし
プログラミングにおいて、曖昧さは敵です。
「なんとなく同じ」は、バグの温床です。
- ==:使わずに封印。
- ===: 常にこれを使う。
=を押す回数が1回増えるのはもしかしたら大変かもしれません。
しかし、その1回のタイプを惜しんで、将来の数時間をデバッグ(修正作業)に費やすよりマシです。
「値が等しいか」を確認したいときは、迷わずイコールを3回連打してください。
比較する時は厳密に、の精神を初心者のうちに覚えちゃいましょう。
それが、あなたのコードの守り神となります。


コメント