オブジェクトの評価/比較
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日
【通常モード で表示】