🎃

PHPのbooleanとempty関数の罠について

2021/11/15に公開

こんにちは、うえむーです。
今回は、PHPのbooleanとempty関数の罠について書きたいと思います。

アンケート結果

先々月、以下の問題をTwitterでアンケートを2日間の期間で取らせていただきました。

$ansの出力結果は?

$bool = false;
$ans = 'A';
$target = 'banana'; 
$array = array('apple','melon','peach');
if(in_array($target, $array)){
  $bool = true;
}
switch (true){
  case empty($bool):
    $ans = 'B';
    break;
  default:
    $ans = 'C';    
    break;
}
print_r($ans);

結果は以下の通りになりました。

https://twitter.com/uemuragame5683/status/1442855879057887235

上記のアンケート結果を見ると「C」が圧倒的に多かったですが実は答えは「B」なのです。

その証拠に、「laravelplayground」で上記のコードをペーストをして実行すると以下のように出力されます。

https://laravelplayground.com/#/

つまり、

bool変数のbool値が「false」の場合、empty($bool)の出力結果は「true」と返却され、
bool値が「true」の場合、empty($bool)の出力結果は「false」と返却されるのです。

phpの公式ドキュメントにPHP型の比較表が記載されております。

PHP 関数による $x の比較

empty()
$x = false; true
$x = true; false

https://www.php.net/manual/ja/types.comparisons.php

まとめ

過去にphpの公式ドキュメントを確認せずに実装したら、不具合が発生したことがありました。
様々な式の出力結果が曖昧だった場合はphpの公式ドキュメントを見て実装するようにしましょう。

Discussion