0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PHP empty()の仕様について

Last updated at Posted at 2023-11-23

はじめに

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 == falseempty()それぞれの判定結果は下記のようになります。

!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 == falseempty()の結果は全く同じで、違うところは、empty()は「未定義の変数の場合に警告を出さない」ところです。
冒頭で説明した!isset() || $var == false!isset()の役割は未定義の変数の場合は警告を出さないようにすることで、判定結果に関しては$var == falseと全く同じということですね。

終わりに

ここまで見ていただきありがとうございました。
言語の細かい仕様って何度も調べがちですよね、、、

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?