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を返す(厳密な比較)
オブジェクトの「値としての等しさ」を判定したいのか、「同一の実体かどうか」を判定したいのかによって、使い分けることが重要です。
-
PHPのダブル否定(!!)演算子とは?仕組みと使い方を実例で解説
PHPにおけるダブル否定(!!)演算子は、論理否定(NOT)演算子「!」を2回連続して適用する書き方です。1つ目の「!」が値を否定(真偽値への変換と反転)し、2つ目の「!」がその結果を再度反転します。その結果、元の値はブール型(true / false)に明示的にキャストされることになります。このテクニックは、任意の値を「真か偽か」という観点だけで評価したい場合に便利です。たとえば、文字列や数値が「空かどうか」「0かどうか」を判定し、結果を true または false のみで扱いたい場面などで活用されます。基本的な動作の仕組みPHPでは、次のような値は偽(false)と評価されます。ブール値
-
PHPで2つの日付を比較する方法|サンプルコード付きで解説
PHPで2つの日付を比較する方法を紹介します。日付が「YYYY-MM-DD」のようにゼロ埋めされた形式で表現されている場合、文字列の比較結果が日付の前後関係と一致するため、等価演算子や大小比較の演算子をそのまま使用できます。例1:等価演算子(==)で日付が等しいかどうかを判定する<?php $dateOne = "2019-10-30"; $dateTwo = "2019-10-30"; echo "日