0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PHPにおける関数での各真偽判定

0
Posted at

概要

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とは一体・・・と思ってはいるけど・・・)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?