empty() で困った話
今 PHP で地獄の案件をやってるんですが、その時に empty()
関数で翻弄された話を書きます。
empty( mixed $var )
empty — 変数が空であるかどうかを検査する
var が存在し、かつその値が空や0でなければ FALSE を返します。 それ以外の場合は TRUE を返します。
次のような値は空であるとみなされます。
"" (空文字列)
0 (整数 の 0)
0.0 (浮動小数点数の 0)
"0" (文字列 の 0)
NULL
FALSE
array() (空の配列)
今の地獄の案件だと、基本的に空文字などのチェックの際に empty()
が使われてるんですが、 API へ送信するデータのチェック処理で empty()
が使われてて、そこで私は翻弄されました。
具体的には↓みたいな感じでチェックされてました。
$hoge = empty($foo) ? null : $foo;
しかし、API 側の仕様で値を指定しない場合は 0
をセットしなさいというルールがあって思ったとおりのレスポンスを受け取れてなかったという。
単純なお話 + empty()
の仕様を知ってれば回避できたバグなのですが、実装者はそこまで考えてなかったのでしょう。(僕は書いてません)
結局↓みたいな感じで、 empty()
+ 空文字チェックで判定とかが正解になるんですかね。
$hoge = empty($foo) && $foo === "" ? null : $foo;
empty()
は判定する値が色々あるので、引数に渡す変数がどういう形で渡されるのかを把握しておかないとバグ製造機になりそうですね。