Blogブログ

PHP empty関数って何

こんにちは、HLCのサポート担当大谷です。
サポート業のかたわらPHPの修正等を担当しており、日々つまづいた事柄などをご紹介しています。

唐突ですがPHPにempty関数ってあると思うんですが、あれ動きおかしくない?と思った事ないですか?
空じゃないのに空と判定され、思ってたんとちゃーう!!っていう事が多くて調べる事なくあまり使ってなかったのですが、調べてみたので今回のテーマとさせていただきました。

empty関数の挙動

とりあえず、どんな値を渡すとどんな結果が返るのか調べるために、以下のようなコードで変数hogeの値を変えながら検証してみました。

$hoge = 1;
if (empty($hoge)){
	var_dump("empty(1) true");
}else{
	var_dump("empty(1) false");
}

結果

  
  • ・empty(1) false
  •   

  • ・empty(0) true
  •   

  • ・empty(-1) false
  •   

  • ・empty(‘1’) false
  •   

  • ・empty(‘0’) true
  •   

  • ・empty(‘-1’) false
  •   

  • ・empty(null) true
  •   

  • ・empty([]) true
  •   

  • ・empty(‘php’) false
  •   

  • ・empty(”) true
  •  

    結果、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");
    }
    

    結果

      
  • ・empty(‘0php’) false
  •   

  • ・empty(‘php0’) false
  •  

    あ、これはちゃんと文字列として判定され、空じゃない(false)と返されてる。
    前回==での比較では、比較前に型変換をしているという事でした。
    なのでemptyでも’0php’を型変換した結果である0とfalseを比較して結果が出され、trueとなるかと思いましたが、ちょっと違うようです。
    似てはいても非なるものなんですね。なんか裏切られた気分もありますが(笑)。

    公式に載っているPHP関数による比較表です。
    これを参考にって事ですね。
    うーん、自分はやっぱりあまり使わないな。たぶん。

    大谷

    執筆者

    Developer

    大谷