【2019年11月15日】

if文による値の等価判定は、どんなシステムでも、どんな言語でも必ずといっていいほど必要になる。
PHPではこの等価判定の時には型を意識していないと落とし穴にはまる場合がある。

<?php

if (0 == 0) {
    print "0 == 0 ⇒ true
"
; } else { print "0 == 0 ⇒ false
"
; } if (0 == '0') { print "0 == '0'true
"
; } else { print "0 == '0'false
"
; } if (0 == false) { print "0 == falsetrue
"
; } else { print "0 == falsefalse
"
; } if ('0' == false) { print "'0' == falsetrue
"
; } else { print "'0' == falsefalse
"
; } if(0 == '') { print "0 == ''true
"
; } else{ print "0 == ''false
"
; } if (false == null) { print "false == null ⇒ true
"
; } else { print "false == null ⇒ false
"
; } if ('' == false) { print "'' == falsetrue
"
; } else { print "'' == falsefalse
"
; } ?>
0 == 0 ⇒ true
0 == '0'true
0 == falsetrue
'0' == falsetrue
0 == ''true
false == null ⇒ true
'' == falsetrue

結果を見たとおり、0と'0'と''とfalseとnullは全て等価と判断されている。

これを理解していないと問題になる場面が時々ある。
PHPでは関数の戻り値の型も制限がなく、一つの関数で、結果によってbool型を返したり、数値型を返したりという事が可能である。

よくあるのは、関数内で異常が発生した場合はfalseが返るという場合。
本来数値の返り値を期待する関数で、falseが返ってきた場合、
ちゃんと数値で0が返ってきた場合と、関数内で問題が発生してfalseが返った場合に、
例えば問題が発生した場合を想定して「if (false == func())」なんて処理をやると、正常に終了して結果が数値の0であった場合にも異常と同じ扱いになってしまう。

こういう場合は型を意識しておく必要がある。
「==」は型関係なしに値を比較する。
それに対して「===」とやることで、型も考慮して比較が行われる。

<?php

if (0 === 0) {
    print "0 === 0 ⇒ true
"
; } else { print "0 === 0 ⇒ false
"
; } if (0 === '0') { print "0 === '0'true
"
; } else { print "0 === '0'false
"
; } if (0 === false) { print "0 === falsetrue
"
; } else { print "0 === falsefalse
"
; } if ('0' === false) { print "'0' === falsetrue
"
; } else { print "'0' === falsefalse
"
; } if (0 === '') { print "0 === ''true
"
; } else{ print "0 === ''false
"
; } if (false === null) { print "false === null ⇒ true
"
; } else { print "false === null ⇒ false
"
; } if ('' === false) { print "'' === falsetrue
"
; } else { print "'' === falsefalse
"
; } ?>
0 === 0 ⇒ true
0 === '0'false
0 === falsefalse
'0' === falsefalse
0 === ''false
false === null ⇒ false
'' === falsefalse

値も型も同じ「0 === 0」のみがtrueとなった。

常に「===」で比較をしていては、いちいち型変換をしてから比較しなければならず、
PHPの手軽さが失われてしまう。

基本的には「==」で、必要なときには「===」を使うと良いだろう。