オブジェクトの比較

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