dポイントプレゼントキャンペーン実施中!

PHP初心者です。
まず、===と!==が型が同じかどうかを比較する演算子だという事は調べて分かりました。
問題は以下のソースコードに関してです。

<?php

class foo {
public $a = 3;
}

class hoge {
public $a = 3;
}

//真偽を文字列に変換する関数
function trueOrFalse($comp) {
return $comp? 'true':'false';
}

//4つの比較演算子を用いた比較の結果の表示
function compareObject($var1, $var2) {
print('$var1 == $var2 --'.trueOrFalse($var1 == $var2)."\n");
print('$var1 != $var2 --'.trueOrFalse($var1 != $var2)."\n");
print('$var1 === $var2 --'.trueOrFalse($var1 === $var2)."\n");
print('$var1 !== $var2 --'.trueOrFalse($var1 !== $var2)."\n");
}

//オブジェクトの生成

$f0 = new foo();
$f1 = new foo();

//$f0を代入、$f2は、$f0と同じオブジェクトを指す
$f2 = $f0;

$h0 = new hoge();

//結果の表示
print("同じクラス、プロパティが同じ\n");
compareObject($f0, $f1);
print("同じオブジェクトを参照\n");
compareObject($f0, $f2);
print("異なるクラス、プロパティは同じ\n");
compareObject($f0, $h0);

?>

この結果分からないのは$f0と$f1の比較で===はfalseに!==はtrueになる事です。
型が違うとは一体どういう事なのでしょうか。
また、付け足す形になりますが、$f0と$h0の比較についても分かりません。
値は両方3です。
なのに==はfalseに!=はtrueになります。
これはどうしてでしょうか。
アドバイスどうぞ宜しくお願い致します。

A 回答 (5件)

$f0 = new foo();


$f1 = new foo();
共に同じfooクラスのインスタンスです。
が、別別のインスタンスです。
「一致演算子(===)を使用する場合、 オブジェクト変数は、同じクラスの同じインスタンスを参照する場合のみ、 等しいとされます。 」
とあります。

一方
「比較演算子(==)を使用する際、 オブジェクト変数は、単純に比較されます。つまり、 二つのオブジェクトのインスタンスは、 同じ属性と値を有し、同じクラスのインスタンスである場合に、 等しいとされます。 」
とあります。
$f0と$h0は別のクラスです。よって
$f0==$h0は偽です。
    • good
    • 0
この回答へのお礼

親切丁寧な回答に感謝します。
これで両方とも疑問が解決できました。

お礼日時:2009/07/16 17:32

PHPの設計者が


一致演算子(===)を使用する場合、オブジェクト変数は、同じクラスの同じインスタンスを参照する場合のみ、等しいとされます。
と決めたのでそういうものと理解するしかないですね
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
なるほど、数学の公式のような感じですかね。

お礼日時:2009/07/16 17:33

==は一致で、===は完全一致ですね。


==ではあいまいに一致を判断するので厳密にはんだするためには
===を使います

<?
$a=null;
if($a=="" && is_null($a) && empty($a) && $a==0) print 1;
?>
これで1が表示されます。
つまり型が違うと、nullと空(empty)と""と0とfalseは同じなんです。

厳密にチェックするにはこうなりますね・・・・
<?
$a=null;
if($a=="" && $a==0 && $a==false && is_null($a) && empty($a)) print 1;
if($a==="") print 2;
if($a===0) print 3;
if($a===false) print 4;
if($a===null) print 5;
?>
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
回答頂いた内容については理解できたつもりです。
その上で言葉足らずの部分を補い、もう1度質問しても宜しいでしょうか。
$f0 = new foo();
$f1 = new foo();
共に同じfooクラスのインスタンスです。
これが完全一致しないのは何故でしょうか。
もう1つここは同じ文になりますが、$f0と$h0の比較についても分かりません。
両方の値は3です。
なのに==はfalseに!=はtrueになります。
何故値は同じなのに一致しないのでしょうか。
この2点について再度アドバイスを頂けると非常に助かります。
答えるかどうかはyambejpさんに全てお任せします。
どうぞ宜しくお願い致します。

お礼日時:2009/07/16 16:14

No.1回答者です。

失礼しました、マニュアルの(例)とほとんど同じ物を質問されているのですね。つまりマニュアルの意味がわからないということですね。
    • good
    • 0

オブジェクトの比較については、マニュアルで説明されています。


http://www.php.net/manual/ja/language.oop5.objec …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!