PHPプログラミングにおいて、変数の状態をチェックする処理は非常に頻繁に発生します。
特に「isset」「empty」「is_null」の3つの関数は、一見すると似たような役割を持っているように感じられますが、その判定ロジックには明確な違いが存在します。
これらの使い分けを誤ると、予期せぬバグやセキュリティリスクを招く可能性があるため、正確な仕様を理解しておくことが重要です。
本記事では、2026年現在の最新のPHP仕様に基づき、それぞれの関数の挙動の違いを比較表を用いて分かりやすく解説します。
isset、empty、is_nullの基本的な役割
PHPで変数の値を評価する際、まずはそれぞれの関数が何を目的として設計されているかを把握する必要があります。
isset関数の特徴
isset関数は、「変数が宣言されており、かつnullではないこと」を確認するための関数です。
変数が定義されていない場合や、値にnullが代入されている場合にはfalseを返します。
逆に、空文字(””)や数値の0、falseなどが代入されている場合は、変数は存在し値もnullではないとみなされ、trueを返します。
// issetの基本的な挙動
$a = 0;
$b = null;
var_dump(isset($a)); // 変数が存在しnullではないのでtrue
var_dump(isset($b)); // 値がnullなのでfalse
var_dump(isset($c)); // 変数自体が未定義なのでfalse
bool(true)
bool(false)
bool(false)
empty関数の特徴
empty関数は、「変数が空であるかどうか」を判定するための関数です。
この関数は、内部的に「!isset($var) || $var == false」と同等の評価を行います。
つまり、変数が存在しない場合はもちろん、数値の0や空の配列、falseといった「PHPにおいて偽(false)とみなされる値」すべてに対してtrueを返します。
// emptyの基本的な挙動
$a = "";
$b = [];
$c = 123;
var_dump(empty($a)); // 空文字なのでtrue
var_dump(empty($b)); // 空の配列なのでtrue
var_dump(empty($c)); // 値が入っているのでfalse
bool(true)
bool(true)
bool(false)
is_null関数の特徴
is_null関数は、名前の通り「変数の値が厳密にnullであるか」をチェックします。
issetとは逆の挙動を示すことが多いですが、大きな違いとして「未定義の変数を渡すと警告(Warning)が発生する」という点が挙げられます。
そのため、変数が確実に定義されていることが保証されている場面で使用するのが一般的です。
// is_nullの基本的な挙動
$a = null;
$b = 0;
var_dump(is_null($a)); // nullなのでtrue
var_dump(is_null($b)); // 0はnullではないのでfalse
// var_dump(is_null($undefined_var)); // Warningが発生する
bool(true)
bool(false)
判定条件の比較一覧表
各関数に様々な値を渡した際の結果を一覧表にまとめました。
この表を参考にすることで、どの関数を使うべきかが一目で判断できます。
| 渡す値(変数の状態) | isset() | empty() | is_null() |
|---|---|---|---|
| 未定義の変数 | false | true | true (Warning) |
| null | false | true | true |
| “” (空の文字列) | true | true | false |
| 0 (数値のゼロ) | true | true | false |
| “0” (文字列のゼロ) | true | true | false |
| false (論理値) | true | true | false |
| [] (空の配列) | true | true | false |
| true (論理値) | true | false | false |
| “abc” (文字列) | true | false | false |
表を見るとわかる通り、「0」や「空文字」の扱いでissetとemptyの結果が逆転する点に注意が必要です。
具体的な使い分けシーン
理論的な違いを理解したところで、実際の開発現場でどのように使い分けるべきかを解説します。
フォームの入力チェック
Webサイトの問い合わせフォームなどで、ユーザーが値を入力したかどうかを確認する場合、emptyがよく使われます。
未入力(空文字)の場合にエラーを出したいケースでは、emptyを使えば「未定義」「null」「空文字」を一括で判定できるからです。
// フォーム送信データのチェック例
if (empty($_POST['username'])) {
echo "ユーザー名を入力してください。";
}
ただし、年齢の入力欄などで「0」という数値が有効な値として扱われる可能性がある場合は注意が必要です。
その場合は、issetを用いて値が存在するかを確認し、別途バリデーションを行うのが適切です。
配列のキー存在確認
連想配列の中に特定のキーが含まれているかを確認したい場合は、issetを使用するのが定石です。
issetは配列のキーに対しても安全に使用でき、キーが存在しない場合にエラーを出すことなくfalseを返してくれます。
$config = ['debug' => false];
// キーが存在するか、かつnullでないかをチェック
if (isset($config['debug'])) {
// 処理を実行
}
もし、値がfalseであっても処理を続行したい場合は、emptyではなく必ずissetを選んでください。
オブジェクトのプロパティや初期化確認
変数が明示的にnullで初期化されているか、あるいは関数からnullが返ってきたかを厳密に調べたいときはis_nullまたは=== null(厳密比較)を使用します。
近年、PHP 8.x以降の型システムが強化された環境では、「is_null($var)」よりも「$var === null」と記述するスタイルも好まれます。
実行速度の面では厳密比較の方がわずかに有利ですが、可読性の観点からis_nullを選択しても問題ありません。
よくある間違いと注意点
初心者が陥りやすいミスとして、issetとemptyの混合が挙げられます。
否定演算子との組み合わせ
「値が入っていること」を確認するために!empty($var)と書くことは非常に多いです。
これは「変数が存在し、かつ中身が空(0や空文字など)ではない」ことを意味します。
一方で、単に変数が定義されていることだけを保証したい場合は、isset($var)を使うべきであり、ここを混同すると「0という入力値が無視される」といった不具合が発生します。
PHP 8.0以降の挙動
PHPのバージョンアップに伴い、細かな判定ロジックが洗練されていますが、今回紹介した3つの関数の根本的な挙動は維持されています。
しかし、文字列と数値の比較(”0″ == 0など)に関する仕様変更の影響を受ける箇所があるため、型を意識したプログラミングがこれまで以上に求められています。
基本的には、「存在確認はisset」「空判定はempty」「null特定はis_null」という原則を守れば、大きなトラブルは防げます。
まとめ
PHPにおける変数の状態チェックは、プログラムの安定性を支える重要な要素です。
最後に、それぞれの関数のポイントをおさらいしましょう。
- isset:変数が存在し、null以外の値が入っているかを確認する。未定義でもエラーにならない。
- empty:変数が「空」であるかを確認する。0、false、空文字、空配列も「空」とみなされる。
- is_null:変数が厳密にnullであるかを確認する。未定義の変数を渡すと警告が出る。
これらの違いを正確に把握することで、バグの少ないクリーンなコードを書くことができるようになります。
まずは比較表をブックマークするなどして、迷ったときにいつでも参照できるようにしておくと便利です。
状況に応じて最適な関数を選択し、安全なPHP開発を心がけましょう。
