PHPの empty() は「変数が空かどうか」を判定する関数です。便利ですが、0 や "0"、false も「空」とみなすため、使いどころを誤るとバグになります。この記事では基本に加え、issetや === "" との使い分けを解説します。
この記事の結論:
empty($var) はfalsyな値すべて(空文字・0・"0"・null・[]・false)で true を返します。「0」を有効な値として扱いたい場合は empty では弾けないため、isset() や === "" と使い分けます。empty()の基本
変数・配列が空か
<?php $var = ""; var_dump(empty($var)); // true(空文字) $array = []; var_dump(empty($array)); // true(空配列) $name = "John"; var_dump(empty($name)); // false
便利な特徴:未定義でも警告が出ない
empty() は未定義の変数や配列キーに対しても警告を出さずにtrue を返します。そのため $_POST などのあるか分からない値のチェックに便利です。
未定義でも安全
<?php
// $_POST["name"] が送られてこなくても警告なし
if (empty($_POST["name"])) {
echo "名前が未入力です";
}
要注意:0や”0″も「空」とみなされる
最大の落とし穴がこれです。empty() は次の値をすべて「空」と判定します。
""(空文字)、"0"(文字列のゼロ)0、0.0(数値のゼロ)null、false[](空配列)
0 が空扱いになる
<?php
$quantity = 0; // 「数量0」という有効な値のつもり
if (empty($quantity)) {
echo "未入力です"; // ← 0 なのに「空」と判定されてしまう!
}
「0」や「0という入力」を有効な値として扱いたいときに
empty() を使ってはいけません。数量・個数・点数など 0 が意味を持つ場面では、empty() が 0 を「空」と誤判定します。次の isset() や === "" を使い分けてください。empty・isset・=== “” の使い分け
| 判定したいこと | 方法 |
|---|---|
| falsyな値すべて(空文字・0・null等)を弾く | empty($x) |
| 変数が設定済みでnullでないか | isset($x) |
| 「空文字だけ」を弾く(0は許可) | $x === "" |
| 未入力か(0は有効値) | !isset($x) || $x === "" |
0を許可しつつ未入力を弾く
<?php
$value = $_POST["quantity"] ?? "";
// 「0」は有効、空文字だけ弾きたい
if ($value === "") {
echo "数量を入力してください";
} else {
$quantity = (int) $value; // 0 もOK
}
よくある質問(FAQ)
Qempty()は未定義変数でエラーになりますか?
Aなりません。
empty() は未定義の変数やキーでも警告を出さず true を返します。$_POST など、あるか分からない値のチェックに便利です。Q0や”0″が「空」と判定されて困ります。
A
empty() はfalsyな値すべて(0・”0″・false等)を空とみなすためです。0を有効値として扱いたいなら empty は使わず、isset() や === "" で判定してください。Qemptyとissetの違いは?
A
isset() は「設定済みでnullでない」か、empty() は「未設定 または falsy」かを判定します。$x = 0 のとき、isset は true、empty は true と結果が分かれます。Q空文字だけを弾きたいです(0は許可)。
A
$x === "" を使います。empty() だと0も弾いてしまうため、空文字だけを判定したい場合は厳密比較が適しています。まとめ
PHPのemptyのポイントを整理します。
empty()はfalsyな値すべて(空文字・0・”0″・null・[]・false)で true- 未定義でも警告なし →
$_POSTのチェックに便利 - 0を有効値にしたい場面では使わない(0も空扱いになる)
- 「設定済みか」は
isset()、「空文字だけ」は=== ""
関連として、NULL判定の方法・Undefined variable の解決方法・if文による条件分岐もあわせて読むと、PHPの判定処理に強くなれます。

