| この記事の要点 |
|
結論: 3 つの関数の違い
本稿は PHP の empty・is_null・isset の判定結果を比較表で掲載し、使い分けを説明します。まず、それぞれが何を判定しているかを押さえておきましょう。
| 関数 | TRUE になる条件 | 種類 | 未定義変数 |
|---|---|---|---|
isset($x) | 変数が存在し、値が null でない | 言語構造 | 警告なしで FALSE |
is_null($x) | 値が null | 関数 | Warning を出して TRUE |
empty($x) | 存在しない、または値が false と同等(""・0・"0"・null・false・空配列 など) | 言語構造 | 警告なしで TRUE |
isset と empty は関数ではなく言語構造のため、未定義の変数や存在しない配列キーを渡しても警告が出ません。一方、is_null は通常の関数なので、引数を評価した時点で「Undefined variable」の Warning(PHP 8 以降)が発生します。
判定比較表
PHP 公式マニュアルの「PHP 型の比較表」をもとにした一覧です。右端の列は if ($x) と書いたときに真として扱われるかどうか(boolean への変換結果)です。
| 式 | gettype() | empty() | is_null() | isset() | if ($x) |
|---|---|---|---|---|---|
$x = ""; | string | TRUE | FALSE | TRUE | FALSE |
$x = null; | NULL | TRUE | TRUE | FALSE | FALSE |
var $x; | NULL | TRUE | TRUE | FALSE | FALSE |
$x が未定義 | NULL | TRUE | TRUE | FALSE | FALSE |
$x = []; | array | TRUE | FALSE | TRUE | FALSE |
$x = ['a', 'b']; | array | FALSE | FALSE | TRUE | TRUE |
$x = false; | boolean | TRUE | FALSE | TRUE | FALSE |
$x = true; | boolean | FALSE | FALSE | TRUE | TRUE |
$x = 1; | integer | FALSE | FALSE | TRUE | TRUE |
$x = 42; | integer | FALSE | FALSE | TRUE | TRUE |
$x = 0; | integer | TRUE | FALSE | TRUE | FALSE |
$x = -1; | integer | FALSE | FALSE | TRUE | TRUE |
$x = "1"; | string | FALSE | FALSE | TRUE | TRUE |
$x = "0"; | string | TRUE | FALSE | TRUE | FALSE |
$x = "-1"; | string | FALSE | FALSE | TRUE | TRUE |
$x = "php"; | string | FALSE | FALSE | TRUE | TRUE |
$x = "true"; | string | FALSE | FALSE | TRUE | TRUE |
$x = "false"; | string | FALSE | FALSE | TRUE | TRUE |
表から分かるポイントは次の通りです。
- isset と is_null は常に逆の結果になる(未定義の場合を除けば
isset($x)は!is_null($x)と同じ) - empty は if ($x) のちょうど逆。ただし未定義でも警告が出ない点が違う
- 文字列
"0"は empty では空扱いだが、"-1"・"false"・"0.0"は空ではない
使い分けの目安
| やりたいこと | おすすめの書き方 |
|---|---|
| フォームの値が送られてきたか | isset($_POST['name']) |
| 値が null かどうかだけ判定 | $x === null(is_null と同じ意味で、関数呼び出しが不要) |
| 未定義・null なら既定値を使う | $name = $_GET['name'] ?? 'guest'; |
| 空文字・未入力を弾く(0 は許可) | trim($x ?? '') === '' で空判定 |
| 配列に要素があるか | !empty($list) または count($list) > 0 |
| 配列のキーが存在するか(値が null でも) | array_key_exists('k', $arr) |
よくある落とし穴
1. empty で必須チェックをすると「0」が入力できない
$qty = $_POST['qty']; // ユーザーが "0" を入力
if (empty($qty)) {
echo '数量を入力してください'; // "0" でもここに入ってしまう
}
数量や点数など 0 が正しい値になりうる項目では、empty ではなく空文字との比較で判定します。
2. 値が null の配列キーは isset で FALSE
$arr = ['key' => null];
var_dump(isset($arr['key'])); // bool(false)
var_dump(array_key_exists('key', $arr)); // bool(true)
「キーが存在するか」を正確に知りたいときは array_key_exists を使います。
3. isset は複数の引数を取れる
if (isset($a, $b, $c)) {
// $a, $b, $c がすべて設定済み(null でない)ときだけ実行
}
4. オブジェクトのプロパティ
マジックメソッドで値を返すクラス(Laravel の Eloquent モデルなど)では、isset や empty の結果は __isset() の実装に依存します。プロパティに値があるのに empty が TRUE になる場合は、このメソッドを確認してください。
確認方法
判定に迷ったら、実際の値で試すのが確実です。
$x = "0";
var_dump(empty($x), isset($x), is_null($x), (bool) $x);
// bool(true) bool(true) bool(false) bool(false)
コマンドラインなら php -r 'var_dump(empty("0"));' のように 1 行で確認できます。
関連
- PHP の比較演算子|== と === の違いと PHP 8 での変更点
- PHP データ型完全ガイド
- PHP の型キャスト|(int) の挙動・filter_var での検証
- PHP 演算子完全リファレンス
子ページ
子ページはありません
同階層のページ
- インストール方法
- 文法
- Composerのインストール
- 内部関数
- フレームワーク
- エラー一覧
- 改行出力
- printとechoの違い
- シングルクォートとダブルクォートの違い
- returnとyieldの違い
- var_dumpをログ出力
- CSV読み込み
- 待機・処理の遅延
- ログファイルにエラーを出力する方法
- エラーログ出力関数
- URLパラメータの配列化
- empty, is_null. issetの判定比較表
- httpステータスコードの付与
- バージョンの確認
- php.ini
- APIを呼び出す方法
- 外部ファイルを呼び出す方法
- カンマ区切りの文字列を配列に変換
- 配列からランダムに値を取り出す方法
- Webスクレイピング
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38