PHPで「変数がNULLか」を判定する方法は複数あり、それぞれ 0 や空文字、未定義の変数で結果が変わるため、使い分けを誤るとバグになります。この記事では is_null・=== null・empty・isset の違いを比較表で整理し、安全な書き方までまとめます。
この記事の結論:「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の違いは?
A
isset() は「設定済みで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の判定処理に強くなれます。
