さてさてこんにちは!
それでは本日もブログを更新していきましょう!
今回もPHPのお話です。
issetだと空文字の時もTrueになってしまう
JSON文字列から特定のキーに紐づく値を取り出して使う時ってありますよね?
例えば、drink
というキーにtea
という値が入っていた時に○○する、water
の時は△△する、何も値が入っていなかった時はエラーを出すみたいな感じです。
で、有効な文字列が入っている時と、NULLまたは空文字の時を区別して処理したい時にどうするか、というお話です。
最初はissetを使っていました。
以下のような感じです。
$body = $request->getContent(); // JSONをパース
$jsonObj = json_decode($body);
if (empty($jsonObj)) {
// エラー処理
}
if(isset($jsonObj->drink)){
// drinkが指定されている場合の処理(ドリンクの注文処理など)
}else{
error_log("I do not need drink","3","{ログを出力するディレクトリまでのパス}");
}
ただ、これだとJSONの中身が以下の様な時にtrueになってしまいます。
"drink":"" // 空文字
ドリンクを頼んでいないのに注文処理が行われてしまうのです。
お客さんも、頼んでいないのにドリンクが来たら困ってしまいますよね。
調べてみたところ、どうやらissetを使ったのが不適切だった様です。
issetって?
公式のドキュメントによると以下のようです。
isset — 変数がセットされていること、そして NULL でないことを検査する
PHP マニュアル 関数リファレンス 変数・データ型関連 変数操作 変数操作 関数
bool isset ( mixed $var [, mixed $… ] )
変数がセットされており、それが NULL でないことを調べます。
つまり、NULLかどうかを調べるだけなので、空文字が入っていてもTRUEになるということですね。
今回は、NULLまたは空文字の時と、文字列が指定されている時とで処理を分けたいので、issetではうまくいきません。
そこで使うのがemptyです。
emptyとは?
公式ドキュメントには以下のようにあります。
empty — 変数が空であるかどうかを検査する
PHP マニュアル 関数リファレンス 変数・データ型関連 変数操作 変数操作 関数
bool empty ( mixed $var )
変数が空であるかどうかを検査します。 変数が空であるとみなされるのは、変数が存在しない場合や 変数の値が FALSE に等しい場合です。
重要なのは後半部分の「変数が空であるとみなされるのは、変数が存在しない場合や 変数の値が FALSE に等しい場合です。」です。
変数が空とみなされるのは以下の場合だそうです。
次のような値は空であるとみなされます。
PHP マニュアル 関数リファレンス 変数・データ型関連 変数操作 変数操作 関数
“” (空文字列)
0 (整数 の 0)
0.0 (浮動小数点数の 0)
“0” (文字列 の 0)
NULL
FALSE
array() (空の配列)
$var; (変数が宣言されているが、値が設定されていない)
空文字も空とみなされるのです!
勿論、NULLの時も空という扱いになります。
以上より、最初に示したコードを修正すると以下のようになります。
処理はこんな感じ。
$body = $request->getContent(); // JSONをパース
$jsonObj = json_decode($body);
if (empty($jsonObj)) {
// エラー処理
}
if(!empty($jsonObj->drink)){
// drinkが指定されている場合の処理(ドリンクの注文処理など)
}else{
error_log("I do not need drink","3","{ログを出力するディレクトリまでのパス}");
}
終わりに
今回はPHPのissetとemptyの違いについて取り上げました。
条件式で使用する場合は判定結果がガラッと変わってしまうので、それぞれの特徴をしっかりと理解することが大切ですね。
それでは、本日はここまで。
お読みいただきありがとうございました!