PHP 5では、オブジェクトの比較は、オブジェクト指向言語に期待される動作に対応し、
PHP 4よりも複雑になっています。(ただし、PHP 5はオブジェクト指向言語ではありません。)
比較演算子(==)を使用する際、
オブジェクト変数は、単純に比較されます。つまり、
二つのオブジェクトのインスタンスは、
同じ属性と値を有し、同じクラスのインスタンスである場合に、
等しいとされます。
一方、一致演算子(===)を使用する場合、
オブジェクト変数は、同じクラスの同じインスタンスを参照する場合のみ、
等しいとされます。
これらのルールを明確に示す例を以下に示します。
例 19-32. 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 "同一クラスの2つのインスタンス\n"; compareObjects($o, $p);
echo "\n同じインスタンスへの2つのリファレンス\n"; compareObjects($o, $q);
echo "\n2つの異なるクラスのインスタンス\n"; compareObjects($o, $r); ?>
|
上の例の出力は以下となります。 同一クラスの2つのインスタンス
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : FALSE
o1 !== o2 : TRUE
同じインスタンスへの2つのリファレンス
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : TRUE
o1 !== o2 : FALSE
2つの異なるクラスのインスタンス
o1 == o2 : FALSE
o1 != o2 : TRUE
o1 === o2 : FALSE
o1 !== o2 : TRUE |
|