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
|
|