is_null?empty?isset?ってなることが多々あったので、比較実験した。
実験内容
それぞれに以下を与えて結果を取得する。
- $string; //変数を宣言するだけ
- $string = 'test'; //文字列
- $string = null; //null
- 未定義の変数
- 空文字
最終結果はページの最後に表にしています。
is_null()
変数がNULLかどうか調べる。つまり、nullならばtrueが、それ以外であればfalseが返ってくる。
$string;
is_null($string); // true
$string = 'test';
is_null($string); // false
$string = null;
is_null($string); // true
//定義していない $a
is_null($a); // true
//空文字
is_null(''); // false
empty()
変数が空であるかどうかを検査する。「変数が空」のイメージがしっくり来ないので、以下でテスト。
$string;
empty($string); // true
$string = 'test';
empty($string); // false
$string = null;
empty($string); // true
//定義していない $b
empty($b); // true
ここまでは、is_nullと挙動が同じだなーって思ったが、以下の挙動が違った。
//空文字
empty(''); // true
空文字は「変数が空である」と捉えられるらしい。
isset()
変数が宣言されていること、そして NULL とは異なることを検査する。
つまり、
- 変数が宣言されている
- その変数がnullではない
という2つの条件が整うとtrueが返ってくる。is_nullとemptyとは異なり2つ条件があるっぽい。
is_nullとemptyとは「あったらtrue」という感じでニュアンスが違う。
$string;
isset($string); //false (変数は宣言されているが、nullなのでアウト)
$string = 'test';
isset($string); // true (変数は宣言され、文字列が与えられているのでセーフ)
$string = null;
isset($string); // false (変数は宣言されているが、nullなのでアウト)
// 定義していない $c
isset($c); // false (変数が宣言されていないのでアウト)
なるほど。じゃあ変数としてではなく、直接文字列とか与えたらどうなる??(以下のように)
isset('');
isset('string');
結果は、
PHP Fatal error: Cannot use isset() on the result of an expression (you can use "null !== expression" instead)
ダメらしい。
まとめ
上の結果を以下の表にまとめました。
$string | $string = 'test' | $string = null | 定義していない変数 | 空文字を直接 | |
---|---|---|---|---|---|
is_null | true | false | true | true | false |
empty | true | false | true | true | true |
isset | false | true | false | false | 空文字にかかわらず直接与えるとエラー |