PHP

【PHP】isset()とempty()の違いとは?【解説】

PHP

PHPには便利な関数が色々とありますよね。
特に、isset()とempty()は、分岐条件の判定を行う際によく使うと思います。

ただ、この2つの関数、ちょっとわかりにくいですよね。
・空文字の時はどうなるの?
・NULLが来たらtrue?それともfalse?
・0はどうなの?
などなど、いざ使おうとしたタイミングで疑問に思った方も多いのではないでしょうか。

実は、私もPHPを使い始めた頃に、isset()とempty()の使い分けを間違えたことがあります。
勉強しはじめのころは結構難しく感じてしまいますよね。

ですが、それぞれの関数の意味はわかりやすいので、一度理解すれば簡単に扱えるようになりますよ。
今回は、そんなisset()とempty()の挙動の違いについて、ご紹介しますね。

isset()は、NULL以外の何かが設定されていればtrue

公式ドキュメントには、以下のように説明されております。

isset — 変数がセットされていること、そして NULL でないことを検査する

つまり、渡された引数にNULL以外の何かが設定されていればtrueを返すということです。

簡単な例で確認してみましょう。

<?php

// 空文字
$var1 = '';
var_dump(isset($var1)); 
// ==> bool(true)

// 文字列
$var2 = 'test';
var_dump(isset($var2)); 
// ==> bool(true)

// 数字
$var3 = 2019;
var_dump(isset($var3)); 
// ==> bool(true)

// 数字の0
$var4 = 0;
var_dump(isset($var4)); 
// ==> bool(true)

// 真偽値(true)
$var5 = true;
var_dump(isset($var5)); 
// ==> bool(true)

// 真偽値(false)
$var6 = false;
var_dump(isset($var6)); 
// ==> bool(true)

// NULL
$var7 = NULL;
var_dump(isset($var7)); 
// ==> bool(false)

?>

このように、変数に格納されている値がNULL以外であれば、とにかくtrue扱いとなります。
ある意味わかりやすいですよね。

勘違いしやすい点としては、以下の場合にisset()ではtrueとなるということです。
・空文字
・0
・false

また、isset()には複数の引数を渡すことができます。
その場合は、渡されたすべての引数がNULL以外の場合のみtrueとなります。
つまり、1つでもNULLがあればfalseになるということです。

以下の例で確認してみましょう。

<?php

// 複数の値(NULLを含まない)
$var8 = 'sample';
$var9 = 100;
var_dump(isset($var8, $var9)); 
// ==> bool(true)

// 複数の値(NULLを含む)
$var10 = 'sample';
$var11 = NULL;
var_dump(isset($var10, $var11)); 
// ==> bool(false)

?>

いかがでしょうか?
確かにNULLの引数があるとfalseとなっていますね。

empty()は、要素が空であればtrue

それでは、empty()はどうでしょうか。
こちらも簡単で、渡された引数の要素が空かどうかで判断しています。

公式ドキュメントには以下のようにあります。

empty — 変数が空であるかどうかを検査する

空というのは以下の場合のことを意味します。
・変数が存在しない
・変数がfalseに等しい

つまり、empty()の場合は、
・0である
・NULLである
・空文字(”)である
・空の配列である
・文字列の0(’0’)である

このような場合に空と判断されてtrueが返されるのです。

こちらも簡単な例で確認してみましょう。

<?php

// 空文字
$var1 = '';
var_dump(empty($var1)); 
// ==> bool(true)

// 文字列
$var2 = 'test';
var_dump(empty($var2)); 
// ==> bool(false)

// 文字列の0
$var3 = '0';
var_dump(empty($var3)); 
// ==> bool(true)

// 数字
$var4 = 2019;
var_dump(empty($var4)); 
// ==> bool(false)

// 数字の0
$var5 = 0;
var_dump(empty($var5)); 
// ==> bool(true)

// 真偽値(true)
$var6 = true;
var_dump(empty($var6)); 
// ==> bool(false)

// 真偽値(false)
$var7 = false;
var_dump(empty($var7)); 
// ==> bool(true)

// NULL
$var7 = NULL;
var_dump(empty($var7)); 
// ==> bool(true)

// 空の配列
$var8 = array();
var_dump(empty($var8)); 
// ==> bool(true)

?>

このように、空であると判断できるものはtrueとなっていますね。
基本的にNULLやfalse、0や空文字といったものが空であると判断されているので、そのルールさえ知っていれば理解しやすいかと思います。

間違いやすい点としては空文字の0もtrueになるところでしょうか。
文字列だからと安心していると引っかかってしまうかもしれませんので、ご注意ください。

終わりに

今回はPHPの関数であるisset()とempty()の違いについてご紹介しました。

簡単に両者の違いをまとめると、以下のようになります。
・isset():変数に何かしら設定されていればtrueを返す。ただし、NULLは除く。
・empty():変数が空っぽかそれに等しければtrueを返す。ただし、falseは除く。

1つ1つの要素ごとにどのように判定されるか覚えられれば一番ですが、そこまでしなくても大丈夫です。
isset()とempty()が、それぞれ何を基準に真偽を判定しているのかを理解できれば、その場で判断することができると思います。

今回はここまでです。それでは。