◀ 17.

PHPのempty・is_null・isset判定比較表|型ごとの戻り値の違い

▶
この記事の要点
  • isset() は「変数が存在し、かつ null でない」なら TRUE。未定義でも警告が出ない
  • is_null() は「値が null」なら TRUE。未定義の変数に使うと Warning が出る
  • empty() は「存在しない、または false と同等の値」なら TRUE。!isset($x) || !$x と同じ
  • 落とし穴: "0"・0・[] も empty では「空」扱い。入力値の必須チェックに empty を使うと「0」が弾かれる
  • null かどうかだけ見たいなら $x === null、既定値の補完は ?? 演算子が簡潔

結論: 3 つの関数の違い

本稿は PHP の empty・is_null・isset の判定結果を比較表で掲載し、使い分けを説明します。まず、それぞれが何を判定しているかを押さえておきましょう。

関数TRUE になる条件種類未定義変数
isset($x)変数が存在し、値が null でない言語構造警告なしで FALSE
is_null($x)値が null関数Warning を出して TRUE
empty($x)存在しない、または値が false と同等(""・0・"0"・null・false・空配列 など)言語構造警告なしで TRUE

isset と empty は関数ではなく言語構造のため、未定義の変数や存在しない配列キーを渡しても警告が出ません。一方、is_null は通常の関数なので、引数を評価した時点で「Undefined variable」の Warning(PHP 8 以降)が発生します。

判定比較表

PHP 公式マニュアルの「PHP 型の比較表」をもとにした一覧です。右端の列は if ($x) と書いたときに真として扱われるかどうか(boolean への変換結果)です。

式gettype()empty()is_null()isset()if ($x)
$x = "";stringTRUEFALSETRUEFALSE
$x = null;NULLTRUETRUEFALSEFALSE
var $x;NULLTRUETRUEFALSEFALSE
$x が未定義NULLTRUETRUEFALSEFALSE
$x = [];arrayTRUEFALSETRUEFALSE
$x = ['a', 'b'];arrayFALSEFALSETRUETRUE
$x = false;booleanTRUEFALSETRUEFALSE
$x = true;booleanFALSEFALSETRUETRUE
$x = 1;integerFALSEFALSETRUETRUE
$x = 42;integerFALSEFALSETRUETRUE
$x = 0;integerTRUEFALSETRUEFALSE
$x = -1;integerFALSEFALSETRUETRUE
$x = "1";stringFALSEFALSETRUETRUE
$x = "0";stringTRUEFALSETRUEFALSE
$x = "-1";stringFALSEFALSETRUETRUE
$x = "php";stringFALSEFALSETRUETRUE
$x = "true";stringFALSEFALSETRUETRUE
$x = "false";stringFALSEFALSETRUETRUE

表から分かるポイントは次の通りです。

  • isset と is_null は常に逆の結果になる(未定義の場合を除けば isset($x) は !is_null($x) と同じ)
  • empty は if ($x) のちょうど逆。ただし未定義でも警告が出ない点が違う
  • 文字列 "0" は empty では空扱いだが、"-1"・"false"・"0.0" は空ではない

使い分けの目安

やりたいことおすすめの書き方
フォームの値が送られてきたかisset($_POST['name'])
値が null かどうかだけ判定$x === null(is_null と同じ意味で、関数呼び出しが不要)
未定義・null なら既定値を使う$name = $_GET['name'] ?? 'guest';
空文字・未入力を弾く(0 は許可)trim($x ?? '') === '' で空判定
配列に要素があるか!empty($list) または count($list) > 0
配列のキーが存在するか(値が null でも)array_key_exists('k', $arr)

よくある落とし穴

1. empty で必須チェックをすると「0」が入力できない

$qty = $_POST['qty'];   // ユーザーが "0" を入力
if (empty($qty)) {
    echo '数量を入力してください';   // "0" でもここに入ってしまう
}

数量や点数など 0 が正しい値になりうる項目では、empty ではなく空文字との比較で判定します。

2. 値が null の配列キーは isset で FALSE

$arr = ['key' => null];
var_dump(isset($arr['key']));             // bool(false)
var_dump(array_key_exists('key', $arr));  // bool(true)

「キーが存在するか」を正確に知りたいときは array_key_exists を使います。

3. isset は複数の引数を取れる

if (isset($a, $b, $c)) {
    // $a, $b, $c がすべて設定済み(null でない)ときだけ実行
}

4. オブジェクトのプロパティ

マジックメソッドで値を返すクラス(Laravel の Eloquent モデルなど)では、isset や empty の結果は __isset() の実装に依存します。プロパティに値があるのに empty が TRUE になる場合は、このメソッドを確認してください。

確認方法

判定に迷ったら、実際の値で試すのが確実です。

$x = "0";
var_dump(empty($x), isset($x), is_null($x), (bool) $x);
// bool(true) bool(true) bool(false) bool(false)

コマンドラインなら php -r 'var_dump(empty("0"));' のように 1 行で確認できます。

関連

Post Share
子ページ

子ページはありません

同階層のページ
  1. インストール方法
  2. 文法
  3. Composerのインストール
  4. 内部関数
  5. フレームワーク
  6. エラー一覧
  7. 改行出力
  8. printとechoの違い
  9. シングルクォートとダブルクォートの違い
  10. returnとyieldの違い
  11. var_dumpをログ出力
  12. CSV読み込み
  13. 待機・処理の遅延
  14. ログファイルにエラーを出力する方法
  15. エラーログ出力関数
  16. URLパラメータの配列化
  17. empty, is_null. issetの判定比較表
  18. httpステータスコードの付与
  19. バージョンの確認
  20. php.ini
  21. APIを呼び出す方法
  22. 外部ファイルを呼び出す方法
  23. カンマ区切りの文字列を配列に変換
  24. 配列からランダムに値を取り出す方法
  25. Webスクレイピング