PHPのisset・empty・is_nullの違いについて

採用はこちら

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

この例では $passwordnull のため、結果は 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

空文字、0false、空配列などは、いずれも 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()
未定義変数falsetrue警告・通知の可能性
nullfalsetruetrue
''truetruefalse
'0'truetruefalse
0truetruefalse
0.0truetruefalse
falsetruetruefalse
truetruefalsefalse
[]truetruefalse
[1]truefalsefalse
'hello'truefalsefalse

この表で特に重要なのは、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'falsenull、空配列など、幅広い値を空として扱います。

一方、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、空配列、false0 などをまとめて空として扱ってよい場合に使います。

$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 と空文字、0false を明確に区別したい場合は、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の違いについてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次