概要
PHPでのコーディングでisset()やis_null()を使って真偽判定をすることがしばしばあるが、色々な種類の関数がある中で具体的に各関数どういった判定をしているのかを改めて再確認してみた。
背景
よそのプロジェクトで特定条件の時に座席番号が表示されない不具合があった。どうも座席番号に0が設定されると発生するようで、席種によっては座席番号が存在しないケースもあるためプログラムに座席番号の存在判定を組み込んでいるのだがこの処理が0も値なしとして判定させてしまっていたようで。
使用している関数によって判定内容ちょっと違いがあったりもするので、ちょっと整理してみた。
・参考
PHP型の比較表
https://www.php.net/manual/ja/types.comparisons.php
比較表
| 式 | empty() | is_null() | isset() |
|---|---|---|---|
| "" | true | false | true |
| null | true | true | false |
| 未定義 | true | true | false |
| true | false | false | true |
| false | true | false | true |
| 0 | true | false | true |
| 1 | false | false | true |
| "0" | true | false | true |
| "1" | false | false | true |
| "hoge" | false | false | true |
| [] | true | false | true |
| ['a', 'b'] | false | false | true |
多分合ってそう・・・。
最初の背景の不具合を聞いた時は0をempty()で判定させてそうと思ったが案の定その通りだった。「0が入っているから空じゃない」って思って使うとよく引っかかると思ってた。文字列の0までtrue判定なのはちょっと頭になかったかも。
表だけ見るとissetはis_nullの逆として考えることができる。空文字や空配列もtrueなので、issetという名前をそのまま受け取って挙動をイメージしていると引っかかりやすいかも。
そこで少し気になったのがよくif文で書いているようなbool判定。if($hoge)みたいな判定って具体的にどういう判定しているのかちょっと調べてみた。
| 式 | if($hoge) |
|---|---|
| "" | false |
| null | false |
| 未定義 | false |
| true | true |
| false | false |
| 0 | false |
| 1 | true |
| "0" | false |
| "1" | true |
| "hoge" | true |
| [] | false |
| ['a', 'b'] | true |
ざっと見た感じemptyの逆みたい。
あまりtrue、falseやnull判定以外の使い方をしないよう気をつけているけどこれも0をfalseと判定したりするので気をつけたい。
どういう意図の判定をしたいのか、どういう値が来る想定となっているかを事前に押さえておかないと意図しない挙動が発生するかもしれないので注意したい。
(そもそも座席番号0とは一体・・・と思ってはいるけど・・・)