動機
最近PHPを触り始めて、POSTされた値の空判定をisset、empty などの関数をどのように使うのがベストか迷ったので、isset と empty、ついでにis_null を比較してベストな判定方法を検討したいと思います。
よりいい方法があればコメント下さい。
関数の概要
関数 | 説明 |
---|---|
isset | 指定した変数がセットされていない、またはNULLであればFALSEを返し、それ以外はTRUEを返す |
empty | 指定した変数が空でないならFALSEをかえし、それ以外はTRUEを返す |
is_null | 指定した変数がNULLであればFALSEを返し、それ以外はTRUEを返す |
emptyの判定条件の空とは?
次のような値は空であるとみなされます。
- "" (空文字列)
- 0 (整数 の 0)
- 0.0 (浮動小数点数の 0)
- "0" (文字列 の 0)
- NULL
- FALSE
- array() (空の配列)
- $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'] = "" となる時、
- issetは空判定ができない、つまりPOSTされたかどうかの判定を意味するものとなる
- emptyは先にも述べたように厳密の意味での空判定ができない
- is_nullを用いるのはもってのほか
では、どのようにすればベストなのでしょうか?
Best Practice
if (isset($_POST['test'])) {
if ($_POST['test'] != "") {
// 空でない
} else {
// $_POST['test']はセットされNULLではないが、空文字である
} else {
// $_POST['test']はセットされていない
}
これがいい方法なのではないでしょうか。
※上記の例では、判定の結果が分かりやすいようにif,else文をちゃんと書いていますが、必ずしも書く必要はありません。