!empty、isset、!==nullの違い

今日はプログラミングの話題です。最近PHPで開発をしている時に奇妙な罠にハマってしまったのでまとめておきます。

 

0という値がnullだと判定された

開発の途中で変数が存在していたら、という条件分岐がありました。元のコードではif(!empty(変数))でこの判定をしていたのですが、変数の中身に0が入っている時に変数が存在していないとされてしまいました。原因はempty()関数は0をnullだと判定してしまう仕様でした。どうやらPHPは型の判定が曖昧で、数字や文字列としての0をnullとしてしまうようです。その対策を調べていると、同じような処理を行う方法が3つありました。

 

empty(変数)

変数が空であるかどうかを検査します。 変数が空であるとみなされるのは、変数が存在しない場合や 変数の値が FALSE に等しい場合です。 empty() は、変数が存在しない場合でも警告を発しません。

マニュアルを見てみると、emptyは変数が空であることを調べる関数のようです。しかし、この「空」の中には値が0や””の場合が含まれてしまいます。また、次のissetと違い引数の変数が存在しない場合でも警告が出ません。今回のように変数が存在しているかを調べる場合は!を前につけることで空でないときにtrueを出すようになります。

 

isset(変数)

変数がセットされており、それが NULL でないことを調べます。

変数が、unset() により割当を解除された場合、 何も値が設定されていない状態になります。 NULLに設定されている変数を調べた場合、 isset()FALSEを返します。 null文字("\0")はPHPの定数 NULLと等価ではないことにも注意してください。

複数のパラメータを渡した場合は、isset() はそれらすべてがセットされている場合にのみ TRUE を返します。 左から順に評価を行い、セットされていない変数があった時点で処理を終了します。

 issetは変数がセットされているかを調べる関数です。セットというのは変数が定義されていて、値が入っていることを指します。issetは変数の中身が0でも””でも値が入っていると判定します。しかし、引数の変数が定義されていない場合は警告を出してしまいます。

 

変数 !== null

これは変数がnullでないかを判定しています。変数が定義されていない、またはnullが代入されている場合にfalseを出します。PHPでは比較演算子が2つの場合は型を比較しません。よって0,”0”,nullはすべて同一のものとしてみなされます。比較演算子が3つになると型も比較するのでこれらは違うものとしてみなされます。

 

 

という訳で、今回は!==nullを使用しました。isset()が使えれば良いのですが、今回のコードでは判定する変数が定義されていない可能性があるので使えませんでした。もしisset()を利用するなら事前に変数が定義されているかを判定する必要があります。