はじめに
empty()の仕様を忘れがちな方、これから知りたい方に向けての記事になります。
結論を見たい方は下記の「まとめ」の表を見てください。
前提
- PHP8.1
emptyの仕様について
公式のドキュメントによると、empty()は !isset($var) || $var == falseと同じ結果になるようです。
変数が存在しなくても警告は発生しません。 つまり、empty() は本質的に
!isset($var) || $var == falseと同じことを簡潔に記述しているだけです。
empty()の挙動を細かく知るために!isset()と$var == falseそれぞれの判定がどのような結果になるのかを見ていきたいと思います。
!isset()の挙動
まずisset()の挙動についてですが、引数が未定義の変数、もしくはnullの場合にfalseを返します。!isset()ではその結果の逆になるので、未定義の変数とnullの場合はtrueを返します。
下記は!isset()の挙動を確認するためのコードです。
<?php
$ary1 = [];
$ary2 = [
'',
"",
[],
true,
false,
0,
1,
'0',
'1',
sqrt(-1), // NANを返す
null,
$foo, // 未定義の変数
$ary1['foo'], // 未定義の配列キー
];
foreach ($ary2 as $value) {
var_dump(!isset($value));
}
処理結果
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(true)
bool(true)
bool(true)
※$fooと$ary['foo]を配列にセットしているため、警告文が表示されます。
$ary['foo']についてですが、配列に定義されていないキーにアクセスした場合、未定義の変数にアクセスした時と同じ挙動になるのでtrueになります。
値と判定結果の表
| 値 | 判定結果 |
|---|---|
| '' | false |
| "" | false |
| [] | false |
| true | false |
| false | false |
| 0 | false |
| 1 | false |
| '0' | false |
| '1' | false |
| NAN | false |
| null | true |
| 未定義変数 | true |
| 未定の配列キー | true |
$var == falseの挙動
比較演算子の==で各値とfalseと比較した場合にどのような結果になるのか下記のコードで確認してみました。
<?php
$ary1 = [];
$ary2 = [
'',
"",
[],
true,
false,
0,
1,
'0',
'1',
sqrt(-1), // NANを返す
null,
$foo, // 未定義の変数
$ary1['foo'], // 未定義の配列キー
];
foreach ($ary2 as $value) {
var_dump($value == false);
}
処理結果
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)
bool(true)
bool(false)
bool(true)
bool(false)
bool(false)
bool(true)
bool(true)
bool(true)
※$fooと$ary['foo]を配列にセットしているため、警告文が表示されます。
値と判定結果の表
| 値 | 判定結果 |
|---|---|
| '' | true |
| "" | true |
| [] | true |
| true | false |
| false | true |
| 0 | true |
| 1 | false |
| '0' | true |
| '1' | false |
| NAN | false |
| null | true |
| 未定義変数 | true |
| 未定の配列キー | true |
!isset()との違いは、空文字、空配列、0、'0'でtrueが返ってくるところです。
まとめ
!isset()、$var == false、empty()それぞれの判定結果は下記のようになります。
| 値 | !isset() | $var == false | empty() |
|---|---|---|---|
| '' | false | true | true |
| "" | false | true | true |
| [] | false | true | true |
| true | false | false | false |
| false | false | true | true |
| 0 | false | true | true |
| 1 | false | false | false |
| '0' | false | true | true |
| '1' | false | false | false |
| NAN | false | false | false |
| null | true | true | true |
| 未定義変数 | true | true | true |
| 未定の配列キー | true | true | true |
表にしてみるとわかるのですが、$var == falseとempty()の結果は全く同じで、違うところは、empty()は「未定義の変数の場合に警告を出さない」ところです。
冒頭で説明した!isset() || $var == falseの!isset()の役割は未定義の変数の場合は警告を出さないようにすることで、判定結果に関しては$var == falseと全く同じということですね。
終わりに
ここまで見ていただきありがとうございました。
言語の細かい仕様って何度も調べがちですよね、、、
参考