こんにちは、HLCのサポート担当大谷です。
サポート業のかたわらPHPの修正等を担当しており、日々つまづいた事柄などをご紹介しています。
唐突ですがPHPにempty関数ってあると思うんですが、あれ動きおかしくない?と思った事ないですか?
空じゃないのに空と判定され、思ってたんとちゃーう!!っていう事が多くて調べる事なくあまり使ってなかったのですが、調べてみたので今回のテーマとさせていただきました。
empty関数の挙動
とりあえず、どんな値を渡すとどんな結果が返るのか調べるために、以下のようなコードで変数hogeの値を変えながら検証してみました。
$hoge = 1; if (empty($hoge)){ var_dump("empty(1) true"); }else{ var_dump("empty(1) false"); }
結果
結果、1,-1,’1′,’-1′,’php’ は空じゃありません!と返されました。
そうですか、じゃないわ。バリバリ値入っとるやんけと言いたい。
でもこの感じ、なんか見た事あるやつや。
以前私のブログでも取り上げさせていただいた、
アレ⇒(PHP 緩やかな比較と厳密な比較について)
この公式の表のfalse列と一致しますね。
なるほど、お前も仲間やったんかと納得(無理やり)。
ということは’0’はtrueだったので、文字列と組み合わせるとどうなるのか疑問が湧きました。
==(緩やかな比較)では、先に型変換を行ってから比較するというルールでした。
‘0php’などの文字列は一体どうなるのでしょうか。
$hoge = '0php'; if (empty($hoge)){ var_dump("empty(1) true"); }else{ var_dump("empty(1) false"); } $hoge = 'php0'; if (empty($hoge)){ var_dump("empty(1) true"); }else{ var_dump("empty(1) false"); }
結果
あ、これはちゃんと文字列として判定され、空じゃない(false)と返されてる。
前回==での比較では、比較前に型変換をしているという事でした。
なのでemptyでも’0php’を型変換した結果である0とfalseを比較して結果が出され、trueとなるかと思いましたが、ちょっと違うようです。
似てはいても非なるものなんですね。なんか裏切られた気分もありますが(笑)。
公式に載っているPHP関数による比較表です。
これを参考にって事ですね。
うーん、自分はやっぱりあまり使わないな。たぶん。