三陸牡蠣復興支援プロジェクト「SAVE SANRIKU OYSTER」



オブジェクトの評価/比較

PHP4とPHP5のオブジェクトの評価/比較の違い

“プロパティを持たないオブジェクト”の評価

PHP4において“プロパティを持たないオブジェクト”は“空(empty)つまり「FALSE」”と評価されていましたが、PHP5では“非空(not empty)つまり「TRUE」”と評価されます。要するに、PHP5ではオブジェクトは常に「TRUE」と評価されます。以下のサンプルと結果をご覧下さい。

<pre>
<?php
    class HODE{
        var $var;
    }
    class NASU{
        //
    }
    
    echo "[PHP".substr(PHP_VERSION, 0, 1), "]\n";
    
    $hode = new HODE;
    $nasu = new NASU;
    
    var_dump(empty($hode)); //プロパティを持つオブジェクト
    var_dump(empty($nasu)); //プロパティを持たないオブジェクト
    
    unset($hode->var);
    $nasu->var = NULL;
    
    var_dump(empty($hode)); //持っていたプロパティをアンセットした
    var_dump(empty($nasu)); //プロパティをセットした
?>
</pre>
[PHP4]
bool(false)
bool(true)
bool(true)
bool(false)
[PHP5]
bool(false)
bool(false)
bool(false)
bool(false)

インストールされているバージョンによる結果が出力されます。

生成したオブジェクトを「empty()」関数で“空”であるか否かを調べました。結果を見ると、PHP4ではプロパティを持たない場合に“空”と評価されていますが、PHP5ではプロパティを持っていてもいなくても常に“空ではない”と評価されています。“PHP5ではオブジェクトは常に「TRUE」と評価”されます。

PHP4とPHP5のオブジェクトの比較の違い

PHP4とPHP5では、2つのオブジェクトを比較した際の評価が変わりました。以下のサンプルと結果をご覧下さい。

<pre>
<?php
    #2つのオブジェクトを比較する関数の定義
    function comparing_object($name1, $name2){
        #変数名を利用して変数へのリファレンスを取得する
        $obj1 =& $GLOBALS[$name1];
        $obj2 =& $GLOBALS[$name2];
        $name1 = '$'.$name1;
        $name2 = '$'.$name2;
        if(is_null($obj2))
            return "N/A";
        $str = $name1;
        if($obj1 === $obj2)
            $str .= " === ";
        else if($obj1 == $obj2)
            $str .= " ==  ";
        else
            $str .= " !=  ";
        return $str.$name2;
    }
    
    #全く同じ構造をした2つのクラスを定義
    class HODE{
        var $var = "var";
    }
    class NASU{
        var $var = "var";
    }
    
    $hode         = new HODE;
    $another_hode = new HODE;
    if(substr(PHP_VERSION, 0, 1) == 5){
        #PHP5用の処理
        $agent_hode  = $hode;
        $clone_hode  = clone($hode); //「clone $hode」はPHP4では不可
        $clone_hode2 = clone($hode);
    }else{
        #PHP4用の処理
        $agent_hode  = NULL;
        $clone_hode  = $hode;
        $clone_hode2 = $hode;
    }
    $clone_hode2->var = "hodenasu";
    $ref_hode =& $hode;
    $nasu     = new NASU;
    
    echo "[PHP".substr(PHP_VERSION, 0, 1), "]\n";
    
    #比較する変数(オブジェクト)名を指定して結果を出力する
    echo
    comparing_object('hode', 'another_hode'), "\n", 
    comparing_object('hode', 'agent_hode'), "\n", 
    comparing_object('hode', 'clone_hode'), "\n", 
    comparing_object('hode', 'clone_hode2'), "\n", 
    comparing_object('hode', 'ref_hode'), "\n", 
    comparing_object('hode', 'nasu');
?>
</pre>
[PHP4]
$hode === $another_hode
N/A
$hode === $clone_hode
$hode !=  $clone_hode2
$hode === $ref_hode
$hode !=  $nasu
[PHP5]
$hode ==  $another_hode
$hode === $agent_hode
$hode ==  $clone_hode
$hode !=  $clone_hode2
$hode === $ref_hode
$hode !=  $nasu

インストールされているバージョンによる結果が出力されます。

まず、「HODE」クラスのオブジェクトを「変数$hode」と「変数$another_hode」に代入し、「変数$agent_hode」に「変数$hode」を“割り当て”(PHP5の場合のみ)、「変数$clone_hode」と「変数$clone_hode2」に「変数$hode」のクローン(コピー)を代入、「変数$clone_hode2」のプロパティを更新し、「変数$ref_hode」に「変数$hode」へのリファレンスを代入、「変数$nasu」に「HODE」クラスと全く同じ構造をした「NASU」クラスのオブジェクトを代入しました。

「変数$hode」と、残りの6つとを比較。

結果をまとめると、下表の様になります。

PHP4とPHP5でのオブジェクトを比較した際の評価の違い
比較対照PHP4の場合PHP5の場合
同じクラスの別オブジェクト完全一致一致
自身を割り当てられた変数N/A完全一致
自身のクローン完全一致一致
自身のクローン(プロパティを更新)不一致不一致
自身へのリファレンスを格納した変数完全一致完全一致
同じ構造の別クラスのオブジェクト不一致不一致

PHP5では、同じクラスの別オブジェクトと、自身のクローンが完全一致しなくなりました。同じクラスでも自身以外のオブジェクトは完全一致しません。オブジェクトAとオブジェクトBが同じクラスでプロパティが同じなら、一致はするが完全一致はしないという事です。

作成日:2005年01月09日 最終更新日:2005年01月09日
【印刷モード風モード で表示】