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になります。
これはどうしてでしょうか。
アドバイスどうぞ宜しくお願い致します。
No.4ベストアンサー
- 回答日時:
$f0 = new foo();
$f1 = new foo();
共に同じfooクラスのインスタンスです。
が、別別のインスタンスです。
「一致演算子(===)を使用する場合、 オブジェクト変数は、同じクラスの同じインスタンスを参照する場合のみ、 等しいとされます。 」
とあります。
一方
「比較演算子(==)を使用する際、 オブジェクト変数は、単純に比較されます。つまり、 二つのオブジェクトのインスタンスは、 同じ属性と値を有し、同じクラスのインスタンスである場合に、 等しいとされます。 」
とあります。
$f0と$h0は別のクラスです。よって
$f0==$h0は偽です。
No.3
- 回答日時:
==は一致で、===は完全一致ですね。
==ではあいまいに一致を判断するので厳密にはんだするためには
===を使います
<?
$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;
?>
アドバイスありがとうございます。
回答頂いた内容については理解できたつもりです。
その上で言葉足らずの部分を補い、もう1度質問しても宜しいでしょうか。
$f0 = new foo();
$f1 = new foo();
共に同じfooクラスのインスタンスです。
これが完全一致しないのは何故でしょうか。
もう1つここは同じ文になりますが、$f0と$h0の比較についても分かりません。
両方の値は3です。
なのに==はfalseに!=はtrueになります。
何故値は同じなのに一致しないのでしょうか。
この2点について再度アドバイスを頂けると非常に助かります。
答えるかどうかはyambejpさんに全てお任せします。
どうぞ宜しくお願い致します。
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
乱数のライブラリについて
-
PHP5で、クラスを作成している...
-
3つ以上の論理積は利用可能なの...
-
VBSの「MsgBox」について
-
PHPで吐き出した画像にリンクを...
-
onedrive にexcelファイルをア...
-
FTPコマンドでディレクトリごと...
-
.phpと.incファイルの違いはな...
-
ヒアドキュメントの中で演算子...
-
ImageCreate関数が undefined f...
-
phpのエラー
-
PHPのif文でその処理を途中で抜...
-
.phpファイルが、表示されない
-
パースエラーとは?
-
別ファイルの変数を呼び出した...
-
Cドライブにある画像を表示したい
-
%php stringcast.php 100
-
phpinfoでloaded modulesが表示...
-
makefile でファイルをコピーす...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
ラッパークラスって何ですか?
-
PHP4、PHP5 1ファイル複数クラ...
-
phpのクラスにて別ファイルの変...
-
class定義のphpをファイル分割...
-
・オブジェクト指向のメリット...
-
配列とオブジェクトの違い
-
PHP,privateの使用理由について
-
クラス変数とインスタンス変数
-
HTMLからRSSを取得できますか?
-
PHPのクラス名の付け方
-
'_'(アンダースコア)の使い方...
-
PHPのフレームワークの中でSmar...
-
require_onceについて
-
phpでオブジェクト指向と呼べる...
-
クラスが配布されているサイト
-
インターフェイスと抽象メソッ...
-
【PHP】クラス と 関数 の違い
-
DirectoryIteratorクラスについて
-
MVCモデル MV間のデータ共有
おすすめ情報