《PHP8上級試験対策》オブジェクト比較演算子(== と === の違い)

  • URLをコピーしました!

はじめに

PHPにおけるオブジェクト比較は、混乱しやすいポイントのひとつです。
===== の挙動を正しく理解することは、試験対策だけでなく、実務でのバグ防止にも直結します。
本記事ではサンプルコードとASCIIアート図解を交えて、わかりやすく整理してみましょう。

キーワード: オブジェクト比較 / == と === / clone / 参照と値

目次

基本ルール

  • ==(等価演算子)
    • クラスが同じで、すべてのプロパティの値が「== による比較」で等しいなら 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
  • === → 参照先(インスタンスそのもの)が同じときだけ true
  • clone は「内容が同じでも別インスタンス」になるため、=== では false

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次