isset()とempty()は何を確認する関数か
isset()は、変数や配列要素が設定されており、値がnullではないかを確認します。未定義の変数やnullに対してはfalseになります。一方、empty()は、対象が未定義、またはfalse・0・空文字列・空配列など、PHP上で空とみなされる値かを確認します。
<?php
$value = 0;
var_dump(isset($value)); // bool(true)
var_dump(empty($value)); // bool(true)
// 実行結果例:
// bool(true)
// bool(true)この例では、0という値自体は設定されているためisset()はtrueです。しかし、empty()では0が空とみなされるためtrueになります。
値ごとの判定結果を一覧で比較する
| 値 | isset() | empty() | 判定の意味 |
|---|---|---|---|
| 未定義の変数 | false | true | 値が存在しない |
| null | false | true | 設定されているが、nullは存在しない値として扱われる |
| 空文字列 “” | true | true | 変数は存在するが、空文字列は空とみなされる |
| 文字列 “0” | true | true | 文字列でも0は空とみなされる |
| 整数 0 | true | true | 0はempty()で空とみなされる |
| false | true | true | falseは空とみなされる |
| 空配列 [] | true | true | 配列は存在するが、空配列は空とみなされる |
| 文字列 “PHP” | true | false | 値が存在し、空ではない |
特に注意したいのは、isset()がtrueになる0やfalseでも、empty()はtrueになる点です。数量の0やチェックボックスのfalseを有効値として扱う場合、empty()だけで必須チェックを行うと意図と異なる判定になる可能性があります。
フォーム入力ではどちらを使うべきか
フォーム値が送信されたかだけを確認したい場合は、isset($_POST[‘name’])が候補になります。空文字列も未入力として扱いたい場合は、empty($_POST[‘name’])が候補です。ただし、空白だけの文字列や入力値の形式・長さ・範囲までは、これらの構文だけでは検証できません。
<?php
$_POST['name'] = '';
$_POST['quantity'] = '0';
var_dump(isset($_POST['name'])); // bool(true)
var_dump(empty($_POST['name'])); // bool(true)
var_dump(isset($_POST['quantity'])); // bool(true)
var_dump(empty($_POST['quantity'])); // bool(true)
// 実行結果例:
// bool(true)
// bool(true)
// bool(true)
// bool(true)必須項目の確認では、まず「0を許可するか」「falseを有効値として扱うか」「空白だけの入力を拒否するか」を決めます。たとえば名前ならtrim()後の空文字列を確認し、数量なら数値への変換後に範囲を検証するなど、要件に合わせて処理を分けます。
配列や設定値のチェックでの使い分け
配列キーが存在し、値がnullではないことを確認したい場合はisset()を使えます。ただし、キーが存在していて値がnullの場合、isset()はfalseになります。nullも含めてキーの存在そのものを確認したい場合は、array_key_exists()を使います。
<?php
$options = [
'timeout' => null,
'retries' => 0,
];
var_dump(isset($options['timeout']));
var_dump(array_key_exists('timeout', $options));
var_dump(isset($options['retries']));
// 実行結果例:
// bool(false)
// bool(true)
// bool(true)設定値が未設定または空の場合に既定値へ切り替える処理ではempty()が便利な場合もあります。しかし、0やfalseを有効な設定値として使うなら、empty()ではなくisset()や値の型に応じた比較を検討します。
flowchart LR
A[配列から値を取得] --> B{キーとnull以外を確認}
B -->|isset true| C[取得した値を採用]
B -->|false| D[既定値または別処理]
D --> E{キー自体の存在が必要}
E -->|array_key_exists| F[nullも含めて判定]図を表示できませんでした。Mermaidコードを確認してください。
この流れでは、まず値を利用できるかをisset()で確認し、nullという値自体を区別したい場合だけarray_key_exists()を使います。
迷わず選ぶための判断手順と実装上の注意点
- 存在しているかを確認したいなら、isset()を候補にする。
- 未定義または空として扱う値かを確認したいなら、empty()を候補にする。
- 0、false、空配列、nullを有効値として扱うかを要件に明記する。
- 形式・長さ・範囲の検証は、isset()やempty()とは別に実装する。
迷ったときは、「存在確認」「空判定」「入力値の妥当性検証」のどれが目的かを切り分けます。isset()とempty()は似ていますが、0やfalseの扱いが異なるため、関数名だけで選ばず、実際に許可する値を基準に判断することが重要です。