PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPにおけるオブジェクトの比較方法:== と === の違いを解説

はじめに

PHPには比較演算子==が用意されており、2つのオブジェクト変数を手軽に比較することができます。この演算子は、両者が同じクラスに属しており、かつ対応するプロパティの値がすべて一致している場合にtrueを返します。

一方、===(厳密等価)演算子を使って2つのオブジェクト変数を比較した場合、両者が同じクラスの同一インスタンスを参照しているときに限りtrueを返します。つまり、値が同じでも別々に生成されたオブジェクトであればfalseとなります。

以下では、これら2つの演算子によるオブジェクト比較の挙動を確認するため、次の2つのクラスを使用します。

比較用クラスの定義

<?php
class test1{
    private $x;
    private $y;
    function __construct($arg1, $arg2){
        $this->x=$arg1;
        $this->y=$arg2;
    }
}
class test2{
    private $x;
    private $y;
    function __construct($arg1, $arg2){
        $this->x=$arg1;
        $this->y=$arg2;
    }
}
?>

ケース1:同じクラスの2つのオブジェクトを比較する

まず、同じtest1クラスから生成した、プロパティ値が同一の2つのオブジェクトを比較してみます。

$a=new test1(10,20);
$b=new test1(10,20);
echo "two objects of same class\n";
echo "using == operator : ";
var_dump($a==$b);
echo "using === operator : ";
var_dump($a===$b);

実行結果

two objects of same class
using == operator : bool(true)
using === operator : bool(false)

このように、==演算子では「同じクラス・同じプロパティ値」という条件を満たすためtrueが返りますが、===演算子では別々に生成されたインスタンスであるためfalseとなります。

ケース2:同一オブジェクトへの2つの参照を比較する

次に、1つのオブジェクトを別の変数に代入し、同一インスタンスへの参照同士を比較します。

$a=new test1(10,20);
$c=$a;
echo "two references of same object\n";
echo "using == operator : ";
var_dump($a==$c);
echo "using === operator : ";
var_dump($a===$c);

実行結果

two references of same object
using == operator : bool(true)
using === operator : bool(true)

$cは$aと同じインスタンスを参照しているため、==と===のどちらの演算子でもtrueが返ります。

ケース3:異なるクラスの2つのオブジェクトを比較する

最後に、プロパティ構成や値が同じでも、クラスが異なるオブジェクト同士を比較します。

$a=new test1(10,20);
$d=new test2(10,20);
echo "two objects of different classes\n";
echo "using == operator : ";
var_dump($a==$d);
echo "using === operator : ";
var_dump($a===$d);

実行結果

two objects of different classes
using == operator : bool(false)
using === operator : bool(false)

クラスが異なる場合は、プロパティの値が完全に一致していても、==と===のどちらの演算子でもfalseが返ります。

まとめ

  • ==演算子:同じクラスに属し、対応するプロパティの値が一致していればtrueを返す(緩やかな比較)
  • ===演算子:同じクラスの同一インスタンスを参照している場合にのみtrueを返す(厳密な比較)

オブジェクトの「値としての等しさ」を判定したいのか、「同一の実体かどうか」を判定したいのかによって、使い分けることが重要です。

  1. PHPのダブル否定(!!)演算子とは?仕組みと使い方を実例で解説

    PHPにおけるダブル否定(!!)演算子は、論理否定(NOT)演算子「!」を2回連続して適用する書き方です。1つ目の「!」が値を否定(真偽値への変換と反転)し、2つ目の「!」がその結果を再度反転します。その結果、元の値はブール型(true / false)に明示的にキャストされることになります。このテクニックは、任意の値を「真か偽か」という観点だけで評価したい場合に便利です。たとえば、文字列や数値が「空かどうか」「0かどうか」を判定し、結果を true または false のみで扱いたい場面などで活用されます。基本的な動作の仕組みPHPでは、次のような値は偽(false)と評価されます。ブール値

  2. PHPで2つの日付を比較する方法|サンプルコード付きで解説

    PHPで2つの日付を比較する方法を紹介します。日付が「YYYY-MM-DD」のようにゼロ埋めされた形式で表現されている場合、文字列の比較結果が日付の前後関係と一致するため、等価演算子や大小比較の演算子をそのまま使用できます。例1:等価演算子(==)で日付が等しいかどうかを判定する<?php    $dateOne = "2019-10-30";    $dateTwo = "2019-10-30";    echo "日