はじめに
PHPにおけるオブジェクト比較は、混乱しやすいポイントのひとつです。==
と ===
の挙動を正しく理解することは、試験対策だけでなく、実務でのバグ防止にも直結します。
本記事ではサンプルコードとASCIIアート図解を交えて、わかりやすく整理してみましょう。
目次
基本ルール
==
(等価演算子)- クラスが同じで、すべてのプロパティの値が「
==
による比較」で等しいなら true
- クラスが同じで、すべてのプロパティの値が「
===
(同一性演算子)- まったく同じインスタンス(同じ参照先)を指しているときだけ true
サンプルコード
<?php
declare(strict_types=1);
error_reporting(-1);
class Hoge {
public function __construct(
private $num,
private $str,
){}
}
$obj_1 = new Hoge(1, 3.14);
$obj_2 = new Hoge(1, '3.14');
$obj_3 = clone $obj_1;
var_dump($obj_1 == $obj_2); // ?
var_dump($obj_1 === $obj_2); // ?
var_dump($obj_1 === $obj_3); // ?
実行結果
bool(true)
bool(false)
bool(false)
ASCIIアート図解
┌────────────┐ ┌────────────┐
│ $obj_1 │ │ $obj_2 │
│ Hoge │ │ Hoge │
│ num = 1 │ │ num = 1 │
│ str = 3.14 │ │ str = "3.14"│
└─────┬──────┘ └─────┬──────┘
│ (内容は==で等しい) │ (別インスタンス)
└───────────────┬──────┘
↓
$obj_1 == $obj_2 → true
$obj_1 === $obj_2 → false
┌────────────┐
│ $obj_3 │ ← cloneされた別インスタンス
│ Hoge │
│ num = 1 │
│ str = 3.14 │
└────────────┘
$obj_1 === $obj_3 → false
まとめ
==
→ クラスが同じで、プロパティ値が等しいなら true===
→ 参照先(インスタンスそのもの)が同じときだけ trueclone
は「内容が同じでも別インスタンス」になるため、===
では false