PHPで条件分岐や入力チェックを書くときによく使うのが、isset()、empty()、is_null() です。
どれも「変数や値の状態を判定する」ために使われますが、それぞれ見ているポイントが異なります。
簡単にまとめると、次のようになります。
| 判定方法 | 主に確認すること | 未定義変数に使えるか | null の扱い |
|---|---|---|---|
isset() | 変数が存在し、かつ null ではないか | 使える | false |
empty() | 値が空として扱われるか | 使える | true |
is_null() | 値が null そのものか | 注意が必要 | true |
なお、厳密には isset() と empty() は関数ではなく、PHPの言語構造です。
一方、is_null() は関数です。
ただし、実務上は「isset() 関数」「empty() 関数」と呼ばれることも多いため、この記事では使い方が分かりやすいように、それぞれの特徴を中心に解説します。
isset() とは
isset() は、変数が定義されていて、かつ値が null ではないかを判定します。
つまり、isset() は次のような確認をしたいときに使います。
「その変数は存在していて、null ではないか?」
isset() の基本例
$name = 'Taro';
var_dump(isset($name)); // true
この場合、$name には文字列が入っているため、isset($name) は true になります。
一方、変数が存在していても、値が null の場合は false になります。
$name = null;
var_dump(isset($name)); // false
未定義変数に対する isset()
isset() は、未定義の変数に対して使ってもエラーにはなりません。
var_dump(isset($undefined)); // false
そのため、未定義の可能性がある変数を安全に確認したいときに便利です。
たとえば、フォームやURLパラメータの値を確認するときによく使われます。
if (isset($_GET['id'])) {
$id = $_GET['id'];
}
このコードでは、$_GET['id'] が存在し、かつ null ではない場合だけ処理を実行します。
isset() は複数の変数も確認できる
isset() は複数の変数をまとめて確認できます。
if (isset($name, $email, $password)) {
// すべての変数が存在し、かつ null ではない場合
}
複数指定した場合、すべての変数が存在していて、かつ null ではない場合のみ true になります。
$name = 'Taro';
$email = 'taro@example.com';
$password = null;
var_dump(isset($name, $email, $password)); // false
この例では $password が null のため、結果は false になります。
empty() とは
empty() は、値が「空」として扱われるかどうかを判定します。
単に空文字かどうかを見るだけではなく、PHPの緩い真偽値判定で false 相当になる値をまとめて空として扱います。
つまり、empty() は次のような確認をしたいときに使います。
「その値は空っぽ扱いできるか?」
empty() の基本例
$name = '';
var_dump(empty($name)); // true
空文字 '' は空として扱われるため、empty($name) は true になります。
empty() が true になる値
empty() が true を返す代表的な値は以下です。
'' // 空文字
'0' // 文字列のゼロ
0 // 整数のゼロ
0.0 // 小数のゼロ
false // false
null // null
[] // 空配列
実際の例は次の通りです。
var_dump(empty('')); // true
var_dump(empty('0')); // true
var_dump(empty(0)); // true
var_dump(empty(0.0)); // true
var_dump(empty(false)); // true
var_dump(empty(null)); // true
var_dump(empty([])); // true
一方、以下のような値は false になります。
var_dump(empty('hello')); // false
var_dump(empty(1)); // false
var_dump(empty(true)); // false
var_dump(empty([1, 2])); // false
未定義変数に対する empty()
empty() も、未定義変数に対して安全に使えます。
var_dump(empty($undefined)); // true
未定義の変数は、empty() では空として扱われます。
そのため、empty() は次のような判定に近いと考えると分かりやすいです。
!isset($var) || $var == false
つまり、empty() は「変数が存在しない場合」または「値が false 相当の場合」に true を返す判定です。
empty() で注意すべき値
empty() で特に注意すべきなのは、0 と '0' です。
$value = '0';
var_dump(isset($value)); // true
var_dump(empty($value)); // true
var_dump(is_null($value)); // false
'0' は値としては存在していますが、empty() では空扱いされます。
そのため、フォーム入力や数値入力の判定で empty() を安易に使うと、意図しないバグにつながることがあります。
たとえば、数量として 0 を有効な値として扱いたい場合、次のようなコードは注意が必要です。
$_POST['quantity'] = '0';
if (empty($_POST['quantity'])) {
echo '数量が入力されていません';
}
この場合、'0' が入力されているにもかかわらず、empty() は true になります。
そのため、0 や '0' を有効な値として扱いたい場合は、empty() ではなく、次のように判定する方が安全です。
if (isset($_POST['quantity']) && $_POST['quantity'] !== '') {
echo '数量が入力されています';
}
空白だけの入力も空として扱いたい場合は、trim() を組み合わせます。
if (isset($_POST['quantity']) && trim($_POST['quantity']) !== '') {
echo '数量が入力されています';
}
empty('0.0') や empty('0.00') には注意
empty('0') は true になりますが、似た値でも結果が異なるケースがあります。
var_dump(empty('0')); // true
var_dump(empty('0.0')); // false
var_dump(empty('0.00')); // false
文字列の '0' は空扱いされますが、'0.0' や '0.00' は空扱いされません。
このように、数値文字列に対して empty() を使うと判定が分かりにくくなることがあります。
金額、数量、スコア、IDなどを扱う場合は、empty() ではなく、仕様に合わせて明示的に比較する方が安全です。
is_null() とは
is_null() は、値が null そのものかどうかを判定する関数です。
つまり、is_null() は次のような確認をしたいときに使います。
「この値は null そのものか?」
is_null() の基本例
$value = null;
var_dump(is_null($value)); // true
値が null の場合、is_null() は true を返します。
一方、null 以外の値では false になります。
var_dump(is_null('')); // false
var_dump(is_null(0)); // false
var_dump(is_null(false)); // false
var_dump(is_null([])); // false
空文字、0、false、空配列などは、いずれも null ではありません。
そのため、is_null() の結果は false になります。
未定義変数に対する is_null()
is_null() は、isset() や empty() と違い、未定義変数に対して安全に使うためのものではありません。
var_dump(is_null($undefined));
このように未定義変数を渡すと、PHPのバージョンやエラーレベルによって警告や通知の対象になる可能性があります。
そのため、未定義の可能性がある変数に対しては、is_null() よりも isset() を使う方が安全です。
if (!isset($value)) {
// $value が未定義、または null の場合
}
is_null() と === null
実務では、is_null() の代わりに厳密比較を使うことも多いです。
if ($value === null) {
// $value は null
}
is_null($value) と $value === null は、通常の値判定ではほぼ同じ意味です。
$value = null;
var_dump(is_null($value)); // true
var_dump($value === null); // true
$value = 0;
var_dump(is_null($value)); // false
var_dump($value === null); // false
=== null は型変換を伴わないため、null そのものかどうかを明確に判定できます。
isset()・empty()・is_null() の比較
代表的な値で比較すると、3つの違いがよく分かります。
| 値 | isset() | empty() | is_null() |
|---|---|---|---|
| 未定義変数 | false | true | 警告・通知の可能性 |
null | false | true | true |
'' | true | true | false |
'0' | true | true | false |
0 | true | true | false |
0.0 | true | true | false |
false | true | true | false |
true | true | false | false |
[] | true | true | false |
[1] | true | false | false |
'hello' | true | false | false |
この表で特に重要なのは、0、'0'、false、'' の違いです。
isset() では true になる値でも、empty() では true になることがあります。
$value = '';
var_dump(isset($value)); // true
var_dump(empty($value)); // true
空文字は変数としては存在しているため、isset() は true です。
しかし、値としては空なので、empty() も true になります。
$value = 0;
var_dump(isset($value)); // true
var_dump(empty($value)); // true
0 も同じです。
変数は存在しているため isset() は true になりますが、empty() では空扱いされるため true になります。
isset() と is_null() の違い
isset() と is_null() は、null の扱いが反対のように見えます。
$value = null;
var_dump(isset($value)); // false
var_dump(is_null($value)); // true
isset() は、変数が存在していても値が null なら false になります。
一方、is_null() は値が null である場合に true になります。
定義済みの通常の変数であれば、以下はほぼ反対の関係です。
isset($value)
!is_null($value)
ただし、未定義変数では挙動が異なります。
var_dump(isset($undefined)); // false
var_dump(is_null($undefined)); // 警告・通知の可能性
そのため、未定義の可能性がある変数には is_null() よりも isset() を使う方が安全です。
isset() と empty() の違い
isset() は、変数が存在していて、かつ null ではないかを確認します。
一方、empty() は、値が空として扱われるかを確認します。
$value = '';
var_dump(isset($value)); // true
var_dump(empty($value)); // true
空文字 '' は、変数としては存在しており、null ではありません。
そのため、isset() は true になります。
しかし、空文字は空として扱われるため、empty() も true になります。
$value = false;
var_dump(isset($value)); // true
var_dump(empty($value)); // true
false も同様です。
変数は存在しているため isset() は true ですが、empty() では空扱いされます。
empty() と is_null() の違い
empty() は、空文字、0、'0'、false、null、空配列など、幅広い値を空として扱います。
一方、is_null() は null だけを true にします。
$value = '';
var_dump(empty($value)); // true
var_dump(is_null($value)); // false
$value = 0;
var_dump(empty($value)); // true
var_dump(is_null($value)); // false
$value = false;
var_dump(empty($value)); // true
var_dump(is_null($value)); // false
このように、empty() と is_null() は判定の範囲が大きく異なります。
「値が未入力っぽいか」をざっくり見たい場合は empty() が便利ですが、「本当に null か」を確認したい場合は is_null() または === null を使うべきです。
配列で使う場合の注意点
配列のキーを確認するときは、isset() と array_key_exists() の違いも重要です。
$user = [
'name' => 'Taro',
'age' => null,
];
この配列に対して isset() を使うと、次のようになります。
var_dump(isset($user['name'])); // true
var_dump(isset($user['age'])); // false
age というキーは存在していますが、値が null のため、isset($user['age']) は false になります。
キーの存在だけを確認するなら array_key_exists()
配列のキーが存在するかどうかだけを確認したい場合は、array_key_exists() を使います。
var_dump(array_key_exists('age', $user)); // true
array_key_exists() は、値が null であっても、キーが存在していれば true を返します。
つまり、次のように使い分けます。
| 確認したいこと | 使用するもの |
|---|---|
キーが存在し、値が null ではないか | isset($array['key']) |
| キーが存在するかだけ | array_key_exists('key', $array) |
配列の値が null になる可能性がある場合は、isset() だけではキーの存在確認として不十分なことがあります。
フォーム入力での使い分け
フォーム入力では、isset()、empty()、is_null() の使い分けが特に重要です。
HTMLフォームから送信される値は、多くの場合文字列としてPHPに渡されます。
そのため、数値のつもりで入力された 0 も、PHP側では '0' として扱われることがあります。
値が送信されたか確認する場合
フォーム項目が送信されたかどうかを確認する場合は、isset() を使います。
if (isset($_POST['email'])) {
// email という項目が送信されている
}
ただし、isset() は値が空文字でも true になります。
$_POST['email'] = '';
var_dump(isset($_POST['email'])); // true
そのため、isset() だけでは「入力されているかどうか」までは確認できません。
値が空文字ではないか確認する場合
値が空文字ではないことを確認したい場合は、次のように書きます。
if (isset($_POST['email']) && $_POST['email'] !== '') {
// email が送信されていて、空文字ではない
}
前後の空白だけの入力も除外したい場合は、trim() を使います。
if (isset($_POST['email']) && trim($_POST['email']) !== '') {
// email が実質的に空ではない
}
empty() を使う場合の注意点
フォーム入力で empty() を使う場合は、'0' が空扱いされる点に注意が必要です。
$_POST['score'] = '0';
if (empty($_POST['score'])) {
echo 'スコアを入力してください';
}
この場合、0 が有効なスコアであっても、empty() は true を返します。
そのため、スコア、数量、金額、ID、フラグなど、0 を有効な値として扱う項目では、empty() を安易に使わない方が安全です。
実務でのおすすめの使い分け
実務では、次のように使い分けると分かりやすいです。
isset() を使う場面
isset() は、変数や配列キーが存在し、かつ null ではないことを確認したいときに使います。
if (isset($_GET['id'])) {
$id = $_GET['id'];
}
主な用途は以下です。
| 場面 | 例 |
|---|---|
| 変数が定義されているか確認したい | isset($value) |
配列キーが存在し、値が null ではないか確認したい | isset($user['name']) |
| GET/POSTの値が送られているか確認したい | isset($_POST['email']) |
| 未定義の可能性がある変数を安全に確認したい | isset($value) |
empty() を使う場面
empty() は、空文字、null、空配列、false、0 などをまとめて空として扱ってよい場合に使います。
$items = [];
if (empty($items)) {
echo '商品がありません';
}
空配列をチェックしたい場合などには便利です。
if (empty($errors)) {
echo 'エラーはありません';
}
ただし、0 や '0' を有効な値として扱う場合は、empty() の使用に注意が必要です。
is_null() を使う場面
is_null() は、値が本当に null かどうかを確認したいときに使います。
if (is_null($deletedAt)) {
echo '削除されていません';
}
実務では、次のように === null を使うことも多いです。
if ($deletedAt === null) {
echo '削除されていません';
}
null と空文字、0、false を明確に区別したい場合は、is_null() または === null を使いましょう。
よくあるバグ例
empty() で 0 が未入力扱いになる
$age = 0;
if (empty($age)) {
echo '年齢が入力されていません';
}
このコードでは、0 が空扱いされます。
年齢で 0 を許可するかどうかは仕様によりますが、数量、金額、スコアなどでは 0 が有効な値になることがあります。
その場合は、次のように明示的に判定する方が安全です。
if ($age === null || $age === '') {
echo '年齢が入力されていません';
}
フォーム入力の場合は、次のように書くとよいです。
if (!isset($_POST['age']) || $_POST['age'] === '') {
echo '年齢が入力されていません';
}
isset() だけで入力済みと判断してしまう
if (isset($_POST['email'])) {
// email が入力されたと判断
}
このコードでは、email という項目が送信されたことは確認できます。
しかし、値が空文字であっても isset() は true になります。
$_POST['email'] = '';
var_dump(isset($_POST['email'])); // true
そのため、入力値が空ではないことも確認したい場合は、次のように書きます。
if (isset($_POST['email']) && trim($_POST['email']) !== '') {
// email が送信されていて、実質的に空ではない
}
迷ったときの判断基準
どれを使うべきか迷った場合は、次の基準で考えると分かりやすいです。
| やりたいこと | 使うもの |
|---|---|
変数が存在し、null ではないか確認したい | isset() |
| 値が空として扱われるか確認したい | empty() |
値が本当に null か確認したい | is_null() または === null |
| 配列キーが存在するかだけ確認したい | array_key_exists() |
0 や '0' を有効な値として扱いたい | empty() は避ける |
| 未定義変数かもしれない | isset() または empty() |
| 型も含めて厳密に判定したい | === / !== |
まとめ
isset()、empty()、is_null() は似ているように見えますが、それぞれ役割が異なります。
isset() は、変数が存在していて、かつ null ではないかを確認するために使います。
isset($value)
empty() は、値が空として扱われるかを確認するために使います。
empty($value)
is_null() は、値が null そのものかを確認するために使います。
is_null($value)
また、実務では is_null() の代わりに、次のように厳密比較を使うことも多いです。
$value === null
特に注意したいのは、empty() が 0 や '0' も空として扱う点です。
empty(0); // true
empty('0'); // true
そのため、フォーム入力や数値入力では、安易に empty() を使うと意図しないバグにつながることがあります。
実務では、次のように使い分けると安全です。
// キーが送られてきたか
isset($_POST['name'])
// 空文字ではないか
isset($_POST['name']) && trim($_POST['name']) !== ''
// null かどうか
$value === null
// 配列キーが存在するか
array_key_exists('name', $user)
この違いを理解しておくと、PHPの条件分岐やフォームバリデーションでのミスを減らせます。
以上、PHPのisset・empty・is_nullの違いについてでした。
最後までお読みいただき、ありがとうございました。










