empty — 変数や式が「空」か(未定義/偽相当/空配列など)を判定する

PHP
  • カテゴリ: PHP
  • 対応バージョン: Laravel 11・12・PHP 8.2
  • 名前空間 / FQCN / コマンド: 言語構造 empty(mixed $var): bool
  • 関連: isset / is_null / strlen / mb_strlen / count
  • 変更履歴: PHP 5.5 以降、変数だけでなくも評価可能に

要点(TL;DR)

  • 値が「空」かどうかを安全に(未定義でも Notice を出さずに)判定する
  • 最低限の使い方:if (empty($value)) { /* 未入力など */ }
  • 罠:'0'(文字列のゼロ)や 00.0[]falsenullempty = true。空白文字 " "false。オブジェクトは基本 false

概要

empty() は未定義の変数や偽相当の値(0"0"、空文字、nullfalse、空配列など)をまとめて 「空」 とみなす判定です。フォーム未入力やオプション値の有無チェックに便利ですが、'0' を空とみなす仕様がバグの原因になりがちです。必要に応じて厳密比較(===)や strlen()/trim() を併用します。

構文 / シグネチャ

bool empty(mixed $var)
  • 引数(表)
引数必須既定値説明
$varmixedはいなし変数または式(PHP 5.5+)。未定義でも Notice なしで評価
  • 戻り値bool(「空」なら true、それ以外は false
  • 例外/副作用:例外は投げない。未定義変数でも Notice を出さない。empty($obj->prop)__isset() があれば呼ばれる

「空」と判定される主な値

判定
""(空文字)true
"0"(文字列ゼロ)true
0, 0.0true
falsetrue
nulltrue
[](空配列)true
オブジェクト(例: new stdClassfalse

使用例

最小例

<?php
$input = $_GET['q'] ?? null;

if (empty($input)) {
    echo "クエリが空です"; // 未定義/空文字/"0"/0/false/null/[] をまとめて空扱い
} else {
    echo "検索: {$input}";
}

実務例(’0′ を空にしたくない場合)

<?php
// 年齢入力。'0'(0歳)を空扱いしたくないケース
$age = $_POST['age'] ?? null;

if ($age === null || $age === '') {   // 未入力のみを空扱い
    $error = '年齢を入力してください';
} elseif (!ctype_digit((string)$age)) {
    $error = '年齢は半角数字で入力してください';
} else {
    $age = (int)$age;
    // ここで 0 も正しく受理される
}

よくある落とし穴・注意

  • ‘0’ 問題empty('0') === true。フォームで 0 を有効値にしたいなら、$v === '' など厳密比較を使う。
  • 空白は空ではないempty(" ")false。空白も無視したいなら trim($v) === '' を併用。
  • オブジェクトは基本 falseempty(new stdClass)false。要素数で判定したいなら empty(count($obj)) などに置き換える。
  • 式の評価:PHP 5.5+ は empty(trim($v)) のような式も可。古い記事を参照して「変数しか渡せない」と誤解しない。
  • isset() との違いisset($v) は「未定義/null 以外」を trueempty($v) は「偽相当/未定義」を true。用途を分ける。

代替・関連APIとの比較

  • isset($v):存在チェックに最適(未定義/null なら false)。値の空判定には不向き。
  • $v === '' / trim($v) === '':文字列の未入力のみを厳密に判定。'0' を空にしない。
  • strlen($v) === 0 / mb_strlen($v) === 0:長さで判定。マルチバイトは mb_strlen
  • count($arr) === 0:配列や Countable の空判定は件数基準が明確。

テスト例(Pest)

<?php

it('detects common empty values', function () {
    expect(empty(''))->toBeTrue();
    expect(empty('0'))->toBeTrue();
    expect(empty(0))->toBeTrue();
    expect(empty(0.0))->toBeTrue();
    expect(empty([]))->toBeTrue();
    expect(empty(null))->toBeTrue();
    expect(empty(false))->toBeTrue();
});

it('treats non-empty correctly', function () {
    expect(empty(' '))->toBeFalse();  // 空白は空ではない
    expect(empty('00'))->toBeFalse(); // "0" 以外の文字列は空ではない
    expect(empty(new stdClass))->toBeFalse();
});

トラブルシュート(エラー別)

症状/エラー原因対処
0 が未入力扱いになるempty('0') === true の仕様'0' を空にしたくないなら === ''trim() === ''、あるいは isset() と組み合わせ
空白のみを弾けないempty(" ") === falsetrim($v) === '' で判定
配列/コレクションの空判定が曖昧empty($arr) は要素数 0 のみ空だが、意図が伝わりにくいcount($arr) === 0 を明示
オブジェクトを empty で判定してしまうオブジェクトは原則空扱いされない件数・状態プロパティで明示的に判定する

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする