PHPプログラムの比較演算子には、 !=, == 以外に !===, === があります
!=== や === は、厳密な比較を行う演算子なので、比較時には黙ってこちらを使っておく癖をつけておきましょう
PHPプログラム言語は、C/C++言語に似ているところも多いので、長年C/C++を使ってきた人は、比較時に != や == を無意識のうちに使ってしまいがちです
C/C++を使ってきた人は、一度ははまってしまうと思いますので要注意です (^_^;)
比較時はキャストの有無を意識する
通常の比較と厳密な比較の違いは、右辺と左辺の 型が違う場合に自動的にキャストして比較するか、型を含めて比較をするかの違いです
PHPプログラム言語は、データ型を意識しなくても自動的に型変換が行われて実行されるのは便利なのですが、そのへんを理解して、キャストが必要ない時は、きちんと明示してあげる必要があります
例えば、strpos 関数は、文字列内から指定した部分文字列が最初に現れる場所を見つける関数ですが、返り値に注意が必要です
ドキュメントにも注意書きがありますが、戻り値は型も含めて比較する必要があります
指定した部分文字列が見つからない時の戻り値は、false となります
また、部分文字列が文字列の先頭にある場合の戻り値は、0 となります
これを != false を使って判断すると、自動的に false が 0 へキャストされて誤判定となってしまいますので、!== false を使い型を含めて判定させる必要があります
他にも、小数点 0.0 と整数 0 の比較、文字列 ‘10’ と整数 10 の比較等でも同様に、通常の比較では自動的にキャストされてしまいますので、通常の比較と厳密な比較では、比較結果が異なってきます
isset や empty での比較について
PHPでは、変数にどんな型のデータでも入れることが出来てしまうので、それらを比較出来るように isset や empty 等の比較用の組み込み機能が用意されていると思いますが、自動キャストの副作用で思わぬ判断となってしまうことがあります
isset 変数がセットされていること、そして NULL
でないことを検査する
empty 変数が空であるかどうかを検査する
この変数がセットされているか、空なのかという判定がキャストとからむことで分かり難くなります
特に空と見なすのが以下の場合となっていますが、2,3,4,6 番あたりのデータを空と見なすのがどうも感覚が合いません
- "" (空文字列)
- 0 (整数 の 0)
- 0.0 (浮動小数点数の 0)
- "0" (文字列 の 0)
NULL
FALSE
- array() (空の配列)
- $var; (変数が宣言されているが、値が設定されていない)
あまり積極的には使いたくないのですが、けっこう使われているので比較内容はきちんと把握しておく必要があります
まとめ
C/C++を使ってきたものとしては、多少冗長な記述となるかも知れませんが次のような優先度で出来るだけデータ型を意識して厳密な比較で判定処理を行おうと思います
- 厳密な比較の !== や === で false 判定
- 厳密な比較の !== や === で null 判定
- 厳密な比較の !== や === で 空文字や文字列判定
- 厳密な比較の !== や === で 整数/浮動小数点値判定
- isset で変数がセットされていること(null を除く)を判定
- empty で変数が空であるかどうか判定
自動キャストを使って簡潔に記述することも必要と思いますが、すぐに isset や empty で判断するのでなく、その前に厳密な比較で処理できないかを検討してから使ったほうがバグも発生しにくくなると思います
厳密に比較することのほうがしっくりきます (^^)