LoginSignup
6
7

More than 5 years have passed since last update.

[PHP 7] isset & empty & is_null を比較してみる

Last updated at Posted at 2018-04-07

動機

最近PHPを触り始めて、POSTされた値の空判定をissetempty などの関数をどのように使うのがベストか迷ったので、issetempty、ついでにis_null を比較してベストな判定方法を検討したいと思います。
よりいい方法があればコメント下さい。

関数の概要

関数 説明
isset 指定した変数がセットされていない、またはNULLであればFALSEを返し、それ以外はTRUEを返す
empty 指定した変数が空でないならFALSEをかえし、それ以外はTRUEを返す
is_null 指定した変数がNULLであればFALSEを返し、それ以外はTRUEを返す

emptyの判定条件のとは?

次のような値は空であるとみなされます。
1. "" (空文字列)
2. 0 (整数 の 0)
3. 0.0 (浮動小数点数の 0)
4. "0" (文字列 の 0)
5. NULL
6. FALSE
7. array() (空の配列)
8. $var; (変数が宣言されているが、値が設定されていない)
(PHP Manualより引用)

上記のようにemptyの場合は、FALSEと等価とみなされる値を空と定義しています。
ログインフォームなどの場合はemptyを使っても問題はないと思いますが、
厳密に空かどうか判定したい時には不適切です。

関数の判定例


$a = "";
var_dump(isset($a));    // TRUE
var_dump(empty($a));    // TRUE
var_dump(is_null($a));  // FALSE

$a = NULL;
var_dump(isset($a));    // FALSE
var_dump(empty($a));    // TRUE
var_dump(is_null($a));  // TRUE

$a = "hello world";
var_dump(isset($a));    // TRUE
var_dump(empty($a));    // FALSE
var_dump(is_null($a));  // FALSE

このようになるので、POSTフォームからname="test"かつ未入力の状態(空文字)で送信された、すなわち$_POST['test'] = "" となる時、
1. issetは空判定ができない、つまりPOSTされたかどうかの判定を意味するものとなる
2. emptyは先にも述べたように厳密の意味での空判定ができない
3. is_nullを用いるのはもってのほか

では、どのようにすればベストなのでしょうか?

Best Practice

if (isset($_POST['test'])) {
   if ($_POST['test'] != "") {
       // 空でない
   } else {
       // $_POST['test']はセットされNULLではないが、空文字である
} else {
   // $_POST['test']はセットされていない
}

これがいい方法なのではないでしょうか。

※上記の例では、判定の結果が分かりやすいようにif,else文をちゃんと書いていますが、必ずしも書く必要はありません。

参考

6
7
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7