【PHP】empty()関数とは?実務での活用シーンを初心者向けに解説
はじめに
PHPで変数の中身が空なのかを素早くチェックしたいときに便利なのが、empty() という関数です。
たとえばフォームから受け取った値が空白のまま送信されていないかや、データベースから取得した値が空ではないかなど、さまざまな場面で活用できます。
一方で、empty() が実際にどのような値を「空」と判定するのかを正確に把握していないと、思わぬところで意図しない動きが発生することがあります。
たとえば数値の 0 や文字列の "0" の扱いなどは、初心者のうちは混乱の原因になりがちです。
そこで本記事では、empty() が判定する内容や具体的な使用例を交えながら、実務でどのように使えばよいのかを整理していきます。
初心者の方でもイメージをつかみやすいように、専門用語はできるだけかみ砕いて解説しますので、ぜひ最後まで読んでみてください。
この記事を読むとわかること
- empty() とは何をする関数なのか
- 実際の開発でよくある利用シーン
- empty() が判定する値の種類と注意点
- isset() や is_null() との違い
- 実務で役立つコード例
empty() とは
empty() は、PHPにおいて変数が「空」であるかを簡単にチェックできる関数です。
条件としては、下記のように判定されるケースをまとめられます。
- 変数が未定義
- null
- boolean の false
- 数値の 0
- 文字列の "0"
- 空文字列 ""
- 空の配列 []
- 空の要素が代入された変数(たとえば空文字を代入した場合など)
これらのいずれかに合致すれば、empty() は true を返します。
ただ、ぱっと見で空に見えない "0"(文字列)や 0(数値)までも空と判断されるのが特徴です。
なぜこういう仕様になっているかというと、ユーザー入力やデータベースから取得した文字列が "0" の場合にも、何も入力されなかったのかと混同されるケースがあるからです。
実務でフォームの入力チェックをする際には、0 や "0" が本当に空扱いでいいのかどうかを十分に検討する必要があります。
実務での活用シーン
empty() は「値が存在しないかどうか」を一括で判定できるため、以下のような場面でとても重宝します。
どのようなシーンが考えられるか、具体例とともに見ていきましょう。
フォームの入力チェック
多くのWebアプリケーションでは、ユーザーが入力した値をサーバー側で受け取り、妥当性を検証します。
たとえば登録フォームでユーザー名やメールアドレスが未入力のまま送信された場合に警告を出す処理を作るとき、empty() が手軽に使えるでしょう。
フォームの内容を受け取った変数が「null や空文字、または 0 や false などの場合にエラーとして扱う」といったロジックをまとめて記述できます。
ただし、後ほど説明するように "0" や 0 が空とみなされる点には気を付ける必要があります。
データベースから取得した値のチェック
データベースから取得した値が想定外に空だったり、そもそも値が取れなかったりすることがあります。
こうしたときに empty() で変数の中身をチェックし、空であれば適切なエラーメッセージや代替処理を行うのは定番のパターンです。
特に統計情報を出力する場面などで、取得した数値が 0 のときに「データなし」とみなすのか、それとも「0 という値が正しく取得されている」のかを区別したい場面があるでしょう。
empty() に任せると 0 も空として扱われるため、0 を一種の「正常な値」と考えるのであれば、むしろ isset() などを使ったほうが混乱を招かないことがあります。
empty() の動作について
empty() は内部的に「値が空かどうか」という判断を行う際、論理的に false と等価かどうかを確認しているイメージで捉えると理解しやすいです。
つまり boolean にキャストしたときに false とみなされる値は、基本的に empty() でも空と判断されるわけです。
ここで注意したいのは、文字列の "0" でも空として扱われることです。
フォームで数値を入力してもらう場面で、ユーザーが 0 と入力した場合に、それを空とみなしてしまうと誤った判定につながります。
また、未定義の変数を指定してもエラーにならず空として判定されるため、プログラムの初期化が不十分だといつの間にか empty() でエラーを見落としてしまうリスクがあります。
こういった微妙な差は意識しないまま開発を進めると、想定外の振る舞いが起こる可能性があるので要注意です。
文字列 "0" を入力されたときに空扱いになるかどうかは、開発するシステムの要件次第で問題になることがあります。 必要に応じて、数値の正当性を判定するなら別の手段を用いるほうが良いかもしれません。
empty() と isset(), is_null() の比較
PHPには値の有無をチェックするための関数として、isset() や is_null() なども用意されています。
これらを使ったときの判定結果と empty() の振る舞いは似ているようで、実はかなり異なる点があります。
isset()
変数が定義されており、なおかつ null でない場合に true を返す。
数値の 0 や文字列の "0" は true となるため、empty() と同じように扱うと誤差が生じる場合もある。
is_null()
変数の値が本当に null のみを対象にチェックする。
つまり 0 や "" は null ではないので、is_null() では false になる。
たとえば、変数が0をとる可能性が高く、かつそれを「空ではない」と扱いたいなら isset() のほうが適していることが多いです。
逆に「何らかの値が入っていればOK、空扱いのものは全部NGにしたい」とざっくり判定する場合は empty() が便利です。
empty() を使ったコード例
ここでは、フォーム入力をチェックする簡単なサンプルと、複数の値をまとめて判定する例を見てみましょう。
<?php // フォームから name, age が送信されたと仮定 $name = $_POST['name']; $age = $_POST['age']; if (empty($name)) { echo "名前を入力してください。"; } else { echo "入力された名前: " . $name; } if (empty($age)) { echo "年齢を入力してください。"; } else { echo "入力された年齢: " . $age; }
上記のように empty() を使うと、未入力や null、0、"0" などを一括で「空」として扱えます。
たとえばユーザーが age フィールドに 0 と入力した場合も、empty($age) が true となり、エラーメッセージを出してしまう点は留意する必要があります。
もう一つ、配列の要素が空かどうかをまとめてチェックする例も見ておきましょう。
<?php $dataList = [ "username" => "alice", "email" => "", "score" => 0, "flag" => false ]; foreach ($dataList as $key => $value) { if (empty($value)) { echo $key . " は空扱いです。"; } else { echo $key . " は空ではありません。"; } echo "\n"; }
ここでは、email, score, flag などの値を順番にチェックしています。
email は空文字、score は 0、flag は boolean false なので、いずれも empty() で空と判定されます。
注意すべきポイント
empty() は便利ですが、活用するうえで誤解しやすいポイントを整理しておくと、後々のバグを未然に防ぎやすくなります。
いくつかの注意点を見ていきましょう。
"0" や 0 を空として扱うかどうか
前述のとおり、文字列 "0" と数値 0 は empty() で空と判定されます。
しかし、0 は通常「何もない」というより「数値が 0」であることを意味するため、本当に空とみなしたいのかどうかは要件次第です。
もし 0 は有効な値として取り扱う必要があるなら、empty() ではなく isset() との組み合わせを検討したり、0 は除外するロジックを入れたりすることをおすすめします。
未定義変数への対処
isset() と違って、empty() は未定義の変数に対してエラーを出さずに処理を継続します。
一見すると便利ですが、変数のタイポ(スペルミス)などがあってもエラーにならず、「空」と判定されてしまうのは困りものです。
そのため、意図せず未定義の変数を参照していないかを確認できるように、基本的には変数の初期化を必ず行い、isset() と組み合わせるかどうか検討しておくと良いでしょう。
バグの原因を突き止めにくくなるケースを避けられます。
false の判定との混同
PHPでは empty() に限らず、boolean の false と他の値(例えば 0 や "")が混同されやすい一面があります。
論理的に false と同じように扱われる値が多いため、開発者が意図するロジックと異なる動作をすることがあるわけです。
empty() では false はもちろん、false と同等とみなされるものすべてを空とみなすので、実装前にテストケースを用意して挙動を確認するのは非常に重要です。
これはコードを安定させるための基本的な作業といえるでしょう。
まとめ
empty() は多彩な「空」を一括で判定できる便利な関数です。
フォームの入力チェックやデータベースからの取得値が空かどうかを確認するときなど、開発の様々なシーンで活用できます。
ただし、0 や "0" まで空と判定される仕様は、状況によっては好ましくない場合があります。
この点を理解せずに使うと、本来は問題ない数値や文字列まで「未入力」とみなしてしまうことがあるでしょう。
また、isset() や is_null() との違いを把握しておくと、用途に応じてどの関数を使うべきか選びやすくなります。
状況に合わせて必要なチェックを行うことで、意図しないバグを防ぎながらスムーズに開発を進められるのではないでしょうか。
以上を踏まえながら、empty() の特性をしっかり理解して活用してみてください。
特に0や"0"をユーザーが入力する場面などでは、empty() でスルーしていいのかを慎重に判断しておきましょう。