PHPの比較演算子に関する質問です。

以下のように記述すると・・

■パターンA
$value = 0;
if($value != 'UNSET'){
 echo 'TRUE';
}else{
 echo 'FALSE';
}

「TRUE」になると想定していたのですが「FALSE」と判定されました。
$valueの値が「-1」等の場合は正常に「TRUE」と判定されます。

■パターンB
$value = 0;
if($value !== 'UNSET'){
 echo 'TRUE';
}else{
 echo 'FALSE';
}

比較演算子を「!==」に変更すると想定通り「TRUE」と判定されました。
なぜパターンAの場合は$valueが0の場合「FALSE」と判定されるのでしょうか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/11/12 15:24:23
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

ポイント100pt

自動型変換が原因です。
型変換させたくなければ!==や===を使います。
http://www.php.net/manual/ja/language.operators.comparison.php

整数値を文字列と比較したり、比較に数値形式の文字が含まれる場合は、文字列が 数値に変換され、 数値としての比較を行います。

=== あるいは !== による比較では型変換は発生しません。 この場合は値だけでなく型も比較します。


型の比較表
http://www.php.net/manual/ja/types.comparisons.php

id:gelgelgel

早速のご回答有難うございます。
質問とずれるかもしれないですが、すべてにおいて使い分け意識することは
私には難しそうですので、基本的には「!==」を利用したほうが良いのでしょうか?
何か注意点などあればアドバイス頂ければありがたいです。

2013/11/12 10:21:22
id:windofjuly

関数の戻り値などで「ゼロ」と「FALSE」を分けなければならない場面など、
システム上厳密でなければならないときだけ「厳密な比較」を行っています。

そうではない場面では「緩やかな比較」を用いています。

お暇なときにwordpressなどのソースコードをざっと眺めてみることを勧めておきますね。

2013/11/12 11:17:48
  • id:tukihatu
    >質問とずれるかもしれないですが、すべてにおいて使い分け意識することは
    >私には難しそうですので、基本的には「!==」を利用したほうが良いのでしょうか?

    私もだ問題ない。

    ということで数字が入るものは数字しかつかわない。文字が入るものは文字しかつかわない。という方法がいいと思います。
    変数の名前は自分で作れるのですから、数字用の変数にはお尻に決まった文字をいれるとかで区別するとこういうミスが発生しにくくなります。(ちなみに私は文字列のお尻にはS、配列のお尻にはD、オブジェクトのお尻にはO、数式のお尻にはBをつけてます)

    とはいえそれでも起こるときは起こるので(例えば変数の存在を調べるときとか)そういう場合は厳密な比較式をつかうなど気をつければと思いますよ!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません