- カテゴリ: 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'(文字列のゼロ)や0、0.0、[]、false、nullは empty = true。空白文字" "は false。オブジェクトは基本 false
概要
empty() は未定義の変数や偽相当の値(0、"0"、空文字、null、false、空配列など)をまとめて 「空」 とみなす判定です。フォーム未入力やオプション値の有無チェックに便利ですが、'0' を空とみなす仕様がバグの原因になりがちです。必要に応じて厳密比較(===)や strlen()/trim() を併用します。
構文 / シグネチャ
bool empty(mixed $var)
- 引数(表)
| 引数 | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
$var | mixed | はい | なし | 変数または式(PHP 5.5+)。未定義でも Notice なしで評価 |
- 戻り値:
bool(「空」ならtrue、それ以外はfalse) - 例外/副作用:例外は投げない。未定義変数でも Notice を出さない。
empty($obj->prop)は__isset()があれば呼ばれる
「空」と判定される主な値
| 値 | 判定 |
|---|---|
""(空文字) | true |
"0"(文字列ゼロ) | true |
0, 0.0 | true |
false | true |
null | true |
[](空配列) | true |
オブジェクト(例: new stdClass) | false |
使用例
最小例
<?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) === ''を併用。 - オブジェクトは基本 false:
empty(new stdClass)はfalse。要素数で判定したいならempty(count($obj))などに置き換える。 - 式の評価:PHP 5.5+ は
empty(trim($v))のような式も可。古い記事を参照して「変数しか渡せない」と誤解しない。 isset()との違い:isset($v)は「未定義/null以外」をtrue。empty($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(" ") === false | trim($v) === '' で判定 |
| 配列/コレクションの空判定が曖昧 | empty($arr) は要素数 0 のみ空だが、意図が伝わりにくい | count($arr) === 0 を明示 |
| オブジェクトを empty で判定してしまう | オブジェクトは原則空扱いされない | 件数・状態プロパティで明示的に判定する |
参考リンク
- PHP公式マニュアル:empty — https://www.php.net/manual/ja/function.empty.php
- PHP公式マニュアル:isset — https://www.php.net/manual/ja/function.isset.php
- PHP公式マニュアル:is_null — https://www.php.net/manual/ja/function.is-null.php
- PHP公式マニュアル:strlen — https://www.php.net/manual/ja/function.strlen.php
- PHP公式マニュアル:ブール型と真偽値の扱い — https://www.php.net/manual/ja/language.types.boolean.php

