[PHP] 値の有り無しを判定するのは、emptyとnotとどっちがいいのか?

2019年6月25日

PHP テクノロジー プログラミング

世間のエンジニア業界では嫌われ者のPHPですが、WEB表示をするシステムで使うには非常に便利に使える言語です。 これからWEBエンジニアを目指す人にとって、LAMPのPを一昔前はPHPやPerlとしていたけど、最近はPythonとする話もチラホラ聞きますが、PHPを避けて通ることは辞めたほうがいいと思います。 世の中のホームページの大半でWordpressが使われていることを考えると、PHPを知らないとWEBエンジニアとしては使えない場面が多くあるという事も安易に理解できます。 そんなPHPという言語は、関数が鬼たくさん存在します。 まるで「関数の玉手箱や〜〜」っていうぐらいの多さに、これから勉強する人は戸惑う人の気持ちも分からなくはないです。 長年PHP言語を使ってきた僕でも、初めて知る標準関数などもあり、実際に使わなくても支障はないのですが、知らないのも気持ち悪いので、リファレンスを見るようにはしています。

empty関数って必要?

if文で、変数が定義されているかどうかを調べるには、isset()関数を使っていましたが、PHP7からはこのお作法から開放されているようです。 でも、下位互換を考えてPHP7お作法に乗っからずにissetを書き続けているのですが、この間人の書いたソースをみていたら、empty()関数を見かけました。 あまり使わない関数だったのですが、!~と書くnot記述とどう違うのかを確認したくて、簡単な実験をしてみました。

emptyリファレンス抜粋

とりあえず、事前にリファレンスページを見て、empty関数の事を完結にまとめてみました。
Version : PHP4以降で利用できる関数 Summary : 変数が空であるかどうかを検査する Var : "" (空文字列) 0 (整数 の 0) 0.0 (浮動小数点数の 0) "0" (文字列 の 0) NULL FALSE array() (空の配列)

比較実験

なんとなく、notと全く同じような気がするので、is_nullやissetなど、気になる関連関数と合わせて比較できるサンプルプログラムを作ってみました。 <?php check(""); check(0); check("0"); check(0.0); check(array()); check(null); check(false); exit(); function check($var){ echo "var : " . $var.PHP_EOL; echo "1. echo : " . $var.PHP_EOL; echo "2. empty : " . empty($var).PHP_EOL; echo "3. not : " . (!$var).PHP_EOL; echo "4. null : " . is_null($var).PHP_EOL; echo "5. bool : " . is_bool($var).PHP_EOL; echo "6. scaler : " . is_scalar($var).PHP_EOL; echo "7. isset : " . isset($var).PHP_EOL; echo PHP_EOL; } $ php empty.php var : 1. echo : 2. empty : 1 3. not : 1 4. null : 5. bool : 6. scaler : 1 7. isset : 1 var : 0 1. echo : 0 2. empty : 1 3. not : 1 4. null : 5. bool : 6. scaler : 1 7. isset : 1 var : 0 1. echo : 0 2. empty : 1 3. not : 1 4. null : 5. bool : 6. scaler : 1 7. isset : 1 var : 0 1. echo : 0 2. empty : 1 3. not : 1 4. null : 5. bool : 6. scaler : 1 7. isset : 1 PHP Notice: Array to string conversion in /var/www/html/labo/php/empty/empty.php on line 14 var : Array PHP Notice: Array to string conversion in /var/www/html/labo/php/empty/empty.php on line 15 1. echo : Array 2. empty : 1 3. not : 1 4. null : 5. bool : 6. scaler : 7. isset : 1 var : 1. echo : 2. empty : 1 3. not : 1 4. null : 1 5. bool : 6. scaler : 7. isset : var : 1. echo : 2. empty : 1 3. not : 1 4. null : 5. bool : 1 6. scaler : 1 7. isset : 1 配列を受け渡した時に、文字列扱いしている箇所でwarningが出ていますが、あまり気にせずに進めます。 まず、emptyとnotは全てが同じ結果になっていることから、"empty() === not"と考えて良さそうです。 ちょっとした気付きなんですが、変数にnullを入れると、issetはfalseを返すと言うことが分かりました。 falseを入れているとtrueを返すのに、不思議ですね・・・

emptyとnotのどちらを使うべきなのか?

この結果から、僕はempty関数は、「不要」と判断しました。 PHPのみを今後ずっと使い続けていくのであれば、empty関数を使うのもいいかもしれませんが、他の言語では使わない関数は使わないほうが、記述ミスにつながるトラブルが減るのは言うまでもありません。 WEBエンジニアというかプログラマーとしての効率化は、こうした言語における便利関数を使うよりも、いくつもの言語で同じ結果が出せるという事も重要なポイントであると考えているので、プログラム標準化を自分の中で行っていくことが重要です。 そもそもPHPもC言語でできているんですからね。

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ