こんにちは!今回はPHPでよく混乱しがちな比較演算子「==」と「===」の違いについて、わかりやすく解説します。
「==」と「===」の基本的な違い
PHPには2種類の等価比較演算子があります:
- 「==」: 値が同じかを比較(型変換あり)
- 「===」: 値と型が両方同じかを比較(型変換なし)
この違いを簡単に言うと:
- 「==」は「だいたい同じ」
- 「===」は「完全に同じ」
わかりやすい例で見てみよう
$a = 5; // 整数
$b = "5"; // 文字列
// ==(ゆるい比較)
var_dump($a == $b); // bool(true) - 中身は同じだからOK!
// ===(厳密な比較)
var_dump($a === $b); // bool(false) - 型が違うからNG!
「5」と「”5″」は「==」では同じですが、「===」では違うものとして扱われます。
配列の比較
配列を比較する場合も大きな違いがあります:
$array1 = [1, 2, 3];
$array2 = [1, 2, 3];
$array3 = ["1", "2", "3"];
// 同じ値の配列の比較
var_dump($array1 == $array2); // bool(true)
var_dump($array1 === $array2); // bool(true)
// 型が異なる配列の比較
var_dump($array1 == $array3); // bool(true) - 値が同じと判断
var_dump($array1 === $array3); // bool(false) - 型が違うのでfalse
配列の場合、「==」は各要素の値だけを比較しますが、「===」は値と型の両方を比較します。
「!=」と「!==」も同じ考え方
否定の場合も同様です:
- 「!=」: 値が異なるかを比較(型変換あり)
- 「!==」: 値または型のどちらかが異なるかを比較(型変換なし)
$a = 0;
$b = "";
var_dump($a != $b); // bool(false) - 型変換するとどちらも「空」なので同じと判断
var_dump($a !== $b); // bool(true) - 型が違うので異なると判断
どっちを使えばいいの?
基本的には「===」を使うことをおすすめします!理由は:
- 予想外の動作を防げる
- コードがより安全になる
- 意図が明確になる
特に以下のような場合は「===」が必須です:
- null値の確認
- 真偽値(true/false)のチェック
- 「0」と空文字列などを区別する必要がある場合
// これはNG(バグの元)
if ($value == null) { ... }
// これがOK
if ($value === null) { ... }
if文の条件で関数を実行する短絡評価
ちなみにPHPのif文の条件部分に関数がある場合、その関数は実際に実行されます。
function checkUser() {
echo "ユーザーをチェックしました";
return true;
}
if (checkUser() && doSomething()) {
// ...
}
この場合、「checkUser()」は必ず実行され、その戻り値がtrueなら「doSomething()」も実行されます。これを短絡評価と言います。
この特性を利用すると、こんな書き方もできます:
// ユーザーが管理者なら処理を実行
$user && $user->isAdmin() && performAdminAction();
まとめ
- 「==」は値だけを比較(型変換あり)
- 「===」は値と型の両方を比較(型変換なし)
- 基本的には「===」を使おう
- 配列の比較でも同じルールが適用される
- 意図的に型変換を利用したい場合のみ「==」を使おう
安全で予測可能なコードを書くために、基本は「===」を使うクセをつけましょう!これでPHPの比較演算子をマスターできたはずです。