![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- Visual Basic(VBA) 2つのシートの任意のセルの番号が一致したら、一致した行をコピーする VBA 2 2023/06/19 20:48
- その他(自然科学) 信頼度がR1、R2の機器を並列に接続した場合、システム全体の信頼度はどれか。答え1-(R1)(1- 2 2023/01/15 21:45
- 物理学 歯車の力の関係を教えてください。添付した条件で力fはどうやって求めますか? 4 2022/10/02 03:06
- 物理学 この問題における抵抗r1とxってどのように考えれば良いのでしょうか?トルクはT=P2/ωsなのでP2 1 2022/06/19 18:46
- 中学校 中2の理科『電流と回路』について質問です。並列回路全体の抵抗は 1/R=1/R1+1/R2 で求めら 5 2023/02/14 20:52
- 物理学 写真のような回路のとき、参考書によれば「直列では電圧比は抵抗比に等しい」ということから、 「R1:R 5 2023/06/29 21:32
- 工学 図のサイリスタ制御調整回路において、 UJT 電源回路にコンデンサをいれて 、R1-UJT-R2間に 1 2022/06/23 14:03
- 工学 この回路でt=0でスイッチを開く時、t<0(定常状態)の時、電流はR2には流れないのですか? 答えを 3 2022/07/02 15:44
- 工学 図のサイリスタ制御調整回路において、 UJT 電源回路にコンデンサをいれて 、R1-UJT-R2間に 1 2022/06/25 08:17
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
ラッパークラスって何ですか?
-
ユーザ定義関数にデフォルト引...
-
Objectの型チェック
-
透過PNGが透過されない!!
-
CFileDialogの最初のディレクト...
-
【file_exists】ファイルが存在...
-
フォントの色を変えるには?
-
VB6にてメールを送信する方法
-
C# Excelファイルへの画像挿入。
-
フォームで戻った際に入力済み...
-
.htaccessにphp_valueが使用できな
-
別ファイルの変数を呼び出した...
-
3つ以上の論理積は利用可能なの...
-
onedrive にexcelファイルをア...
-
PHPのif文でその処理を途中で抜...
-
$_SESSION 有効期限をブラウザ...
-
リクエストメソッド
-
pg_exec()、pg_result()は、使...
-
VBSの「MsgBox」について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
phpのクラスにて別ファイルの変...
-
ラッパークラスって何ですか?
-
class定義のphpをファイル分割...
-
phpのクラスメソッドの定義が長...
-
'_'(アンダースコア)の使い方...
-
クラス
-
配列とオブジェクトの違い
-
PHPのクラス名の付け方
-
codeigniter cartのoptions
-
メンバインスタンスへのアクセ...
-
PHPでオブジェクト指向開発して...
-
ユーザー定義関数とクラスの違...
-
ソースファイルの分け方について
-
データベースで値をインクリメ...
-
require_onceについて
-
PHPでサブクラスからスーパクラ...
-
phpで使用不可のクラス名
-
php、可変プロパティ名について
-
比較演算子===と!==について
おすすめ情報