PHP 5 のオブジェクト比較は PHP 4 よりも複雑で、望ましい結果はオブジェクト指向言語とより一貫しています。
比較演算子 (==) を使用して 2 つのオブジェクト変数を比較する場合、比較原則は次のとおりです。2 つのオブジェクトの属性と属性値が等しく、2 つのオブジェクトが同じクラスのインスタンスである場合、この場合、2 つのオブジェクト変数は等しくなります。
等価演算子 (===) を使用する場合、これら 2 つのオブジェクト変数は特定のクラスの同じインスタンス (つまり、同じオブジェクト) を指している必要があります。
上記の原則は、次の例を通じて理解できます。
例 #1 PHP 5 のオブジェクト比較
<?php function bool2str($bool) { if ($bool === false) { return 'FALSE'; } else { return 'TRUE'; } } function compareObjects(&$o1, &$o2) { echo 'o1 == o2 : ' . bool2str($o1 == $o2) . "\n"; echo 'o1 != o2 : ' . bool2str($o1 != $o2) . "\n"; echo 'o1 === o2 : ' . bool2str($o1 === $o2) . "\n"; echo 'o1 !== o2 : ' . bool2str($o1 !== $o2) . "\n"; } class Flag { public $flag; function Flag($flag = true) { $this->flag = $flag; } } class OtherFlag { public $flag; function OtherFlag($flag = true) { $this->flag = $flag; } } $o = new Flag(); $p = new Flag(); $q = $o; $r = new OtherFlag(); echo "Two instances of the same class\n"; compareObjects($o, $p); echo "\nTwo references to the same instance\n"; compareObjects($o, $q); echo "\nInstances of two different classes\n"; compareObjects($o, $r); ?>
上記のルーチンは出力します:
Two instances of the same class o1 == o2 : TRUE o1 != o2 : FALSE o1 === o2 : FALSE o1 !== o2 : TRUE Two references to the same instance o1 == o2 : TRUE o1 != o2 : FALSE o1 === o2 : TRUE o1 !== o2 : FALSE Instances of two different classes o1 == o2 : FALSE o1 != o2 : TRUE o1 === o2 : FALSE o1 !== o2 : TRUE
注:
PHP 拡張機能でオブジェクト比較の原則を自分で定義できます。