PHP 5におけるオブジェクトの比較

警告

この拡張モジュールは、 実験的 なものです。この拡張モジュールの動作・ 関数名・その他ドキュメントに書かれている事項は、予告なく、将来的な PHP のリリースにおいて変更される可能性があります。 このモジュールは自己責任で使用してください。

PHP 5では、オブジェクトの比較はPHP 4よりも複雑になり、 オブジェクト指向言語で期待される動作により近くなります。 (PHP 5はオブジェクト指向言語ではありません)

比較演算子( == )を用いた場合、 オブジェクト変数は単純に比較されます。つまり、 同じ属性と値を有し、同じクラスのインスタンスである場合に 二つのオブジェクトのインスタンスが等しくなります。

一方、identity演算子( === )の場合、 オブジェクト変数は、同じクラスの同じインスタンスを参照する場合のみ 等しくなります。

これらの規則を明確にするための例を示します。

例 18-3. 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 {
    var
$flag ;

    function
Flag ( $flag = true ) {
            
$this -> flag = $flag ;
    }
}

class
OtherFlag {
    var
$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 similarly named classes in different namespaces o1 == o2 : FALSE o1 != o2 : TRUE o1 === o2 : FALSE o1 !== o2 : TRUE