【PHP】NULL判定の方法|===null・is_null・empty・issetの違いと使い分け

PHPで「変数がNULLか」を判定する方法は複数あり、それぞれ 0 や空文字、未定義の変数で結果が変わるため、使い分けを誤るとバグになります。この記事では is_null=== nullemptyisset の違いを比較表で整理し、安全な書き方までまとめます。

この記事の結論:「NULLか」を厳密に判定するなら $var === null が最適です(is_null() と同じ結果で、関数呼び出しが無いぶん高速)。empty()0 や空文字もtrueになり、isset() はNULL・未定義でfalseになる点に注意します。
スポンサーリンク

=== null で厳密に判定する(推奨)

厳密比較演算子 === でNULLと比較するのが、最も明快で高速な方法です。型まで含めて「ちょうどNULLか」を判定できます。

=== null
<?php
$var = null;

if ($var === null) {
    echo 'NULLです';
} else {
    echo 'NULLではありません';
}

is_null() で判定する

is_null() も同じ結果を返します。=== null機能は同等ですが、関数呼び出しのぶんわずかに遅く、一般には === null が好まれます。

is_null
<?php
$var = null;
var_dump(is_null($var));   // true
var_dump($var === null);   // true(同じ結果)

empty()とisset()との違い

empty() はNULL以外に 0・空文字・空配列・false なども「空」とみなします。isset() は「変数が設定済みでNULLでない」かを返します。これらは「NULLかどうか」だけを見る関数ではない点に注意が必要です。

empty / isset
<?php
$var = null;

var_dump(empty($var)); // true(NULLは空とみなす)
var_dump(isset($var)); // false(NULLはisset的に未設定扱い)

4つの判定方法の比較表(実測)

同じ値でも結果が異なります。下表で違いを把握してください(◯=true、×=false)。

=== null is_null empty isset
null ×
0 × ×
""(空文字) × ×
"0" × ×
[](空配列) × ×
false × ×
未定義の変数 ×(※警告) ×(※警告) ×
「NULLか」だけを見たいなら === null / is_null()「空っぽか(0や空文字も含む)」なら empty()「変数が使える状態か」なら isset() と覚えます。empty() で「NULLか」を判定すると、0 や空文字まで巻き込むので要注意です。
未定義の変数に === null / is_null() を使うと「Undefined variable」警告が出ます(詳細)。未定義の可能性があるなら isset() や次の ?? を使ってください。empty() の詳しい挙動はemptyで変数や配列が空か確認する方法を参照。

NULLを安全に扱う:?? と ?->

NULLの可能性がある値は、判定して分岐するよりnull合体演算子 ?? で既定値を与えるとスッキリ書けます。PHP 8.0以降はnullsafe演算子 ?-> でNULLのオブジェクトのメソッド呼び出しも安全に行えます。

?? と ?-> (未定義・NULL対策)
<?php
// 未定義/NULLなら既定値(警告も出ない)
$name = $data["name"] ?? "ゲスト";

// PHP 8.0+: $user が null でもエラーにならず null を返す
$city = $user?->getAddress()?->city;

よくある質問(FAQ)

QNULL判定は === null と is_null どちらが良いですか?
A結果は同じですが、$var === null が推奨です。関数呼び出しが無いぶん高速で、型まで厳密に判定できます。
Qempty()でNULL判定してはいけませんか?
A「NULLかどうか」だけを見たい場合は不向きです。empty()0・空文字・空配列・false もtrueにするため、意図せず巻き込みます。NULL限定なら === null を使ってください。
Qissetとis_nullの違いは?
Aisset() は「設定済みでNULLでない」かを返し、NULLや未定義ではfalseです。is_null() は「NULLか」を返し、未定義変数では警告が出ます。未定義の可能性があるなら isset() が安全です。
QNULLのとき既定値を使いたいです。
Anull合体演算子 ?? を使います。$x = $value ?? "既定値"; で、左がNULL(または未定義)なら右の値になります。判定して分岐するより簡潔です。

まとめ

PHPのNULL判定のポイントを整理します。

  • 「NULLか」を厳密に見るなら $var === null(推奨)/ is_null()
  • empty()0・空文字なども空とみなす(NULL限定ではない)
  • isset() はNULL・未定義で false
  • 未定義変数に === null は警告 → isset()??
  • NULL対策は ??、PHP 8は ?->(nullsafe)も活用

関連として、emptyで空か確認する方法Undefined variable の解決方法in_arrayで値の存在を確認する方法もあわせて読むと、PHPの判定処理に強くなれます。