PHPで値の確認のときに頻繁に使うisset()とempty()の使い方を紹介します。
またJavaScriptとの違いについてもまとめました。
先に結論です。PHPのisset()は「変数が定義されていて、かつnullではない」ときにtrue、empty()は「未定義、またはfalsyな値」のときにtrueを返します。
JavaScriptにissetという関数はありません。同じ判定をしたいときはtypeof value !== 'undefined'で未定義を、value != nullでnullとundefinedをまとめて確認します。
isset()とempty()
phpのisset()はnull以外の値でtrue
phpでは、JavaScriptにはないisset()を使って値の確認を行うことが多いです。
issetは、変数が定義されており、かつnull以外の値のときにtrueを返します。
$num = 0;
$num2 = 2;
if(isset($num)) {
echo '値あるよ';
} else {
echo '値ないよ';
}
// 値あるよ
上の場合、0でfalsyな値ではあっても、値が定義されていて、かつ、nullではないため、trueとなります。
このように、基本的には変数が定義されている場合、trueを返します(nullと定義しない限り)
issetがfalseになるケース
if(isset($num5)) {
echo '値あるよ';
} else {
echo '値ないよ';
}
// 値ないよ
上のように定義していない変数の場合、falseになります。
$num8 = null;
if(isset($num8)) {
echo '値あるよ';
} else {
echo '値ないよ';
}
// 値ないよ
上のようにnull、空ですよと定義した場合、falseになります。
JavaScriptでやるphpのisset()を使いたい場合
JavaScriptにisset()はないため、目的に合わせて次のように書きます。
// 未定義かどうかだけを見る(宣言していない変数でもエラーにならない)
if (typeof obj.foo !== 'undefined') {
// your code here
}
// nullとundefinedをまとめて除外する(PHPのisset()に一番近い)
if (obj.foo != null) {
// your code here
}
// キーが存在するかを見る(値がundefinedでもtrue)
if ('foo' in obj) {
// your code here
}
if (Object.hasOwn(obj, 'foo')) {
// 継承したプロパティを除いて自分のキーだけを見る
}
通常はtypeofを使う書き方が基本です。
!= nullの比較は、ゆるい比較(!=)を使うことでnullとundefinedの両方をまとめて弾けるため、「値が入っているか」を見たいときに向いています。
深い階層を安全にたどるなら、オプショナルチェーンobj?.foo?.barと、null合体演算子obj.foo ?? '既定値'を組み合わせると、isset()で守っていた場面の多くを短く書けます。
Object.hasOwn()は比較的新しいメソッドで、古い環境ではObject.prototype.hasOwnProperty.call(obj, 'foo')を使います。
詳しくは、stackoverflowがわかりやすいです。
phpのempty()はisset()がfalseの場合か値がfalsyなときにtrue
empty()は、isset()がfalseの場合か値がfalsyなときにtrueを返します。
$num = 0;
$num2 = 3;
if(empty($num)) {
echo '空ですよ';
} else {
echo '空じゃないですよ';
}
// 空ですよ
falsyな値をいれるとtrueになります。
- “”(空文字)
- NULL
- 0(数値、文字列)
- FALSE
phpは文字列の「0」もfalsyな値として認識されるため、「0」を入力として受け付けるフォームではempty()ではなくisset()や=== ''で判定します。
!empty()で「空でないとき」
否定の論理演算子をつけて、「空でないとき」を確認したい場合によくempty()を使います。
if(!empty($num)) {
...
}
空の判定の注意点
空の判定は言語でマチマチで、phpとJavaScriptでも違うので注意が必要です。
参考:https://ka2.org/javascript-function-that-can-determine-whether-specific-value-is-emptyやhttps://qiita.com/sibusuke/items/d95275c89a623b805441などを参考にしてみるといいです。
issetとemptyの注意点
どちらも未定義の変数に対して警告を出さないため、変数名のタイプミスに気づけないことがあります。
$_GET['id']のように存在しないかもしれないキーを読むときは便利ですが、自分で定義したはずの変数に使う場合はスペルを見直す習慣をつけると安全です。
なお、isset()で見ている「変数が定義されているか」は、その場所から変数が見えるかどうかにも左右されます。関数の中でグローバル変数がissetでfalseになる場合は、PHPのグローバルスコープ・ローカルスコープ・スーパーグローバルを確認してください。
また、isset()は変数専用で、define()やconstで作った定数には使えません。定数の有無はdefined()で調べます。定数の書き方はPHPの定数の使い方とconstとdefineの違いにまとめています。