phpのisset()とis_null()とempty()とif($foo)の違いにいまさら気がついた

phpで変数の値の有無について判別する場合、isset()やempty()やif文にそのまま変数だけ書いたりします。
この判別がゆるゆるで、例えば empty('0') は string が入ってるのに true で空っぽ扱いです。
確かにゼロですけどね。
柔軟で人間らしいという声もあるけど、シビアに判別したい時は、勘違いしてたら怖いので一々ドキュメントを確認しないとだったりします。
この柔軟性に加えて、タイトルにもあるとおり4種類の判別方法があって、人によって使うのが違ったりするのでちょいちょい混乱します。

実は判別方法は4種類じゃなくて2種類だった

さっきも、ちょっと分からなくなってドキュメントを見てたんですが、いい加減把握しようとおもってよーく見てたら気がつきました。

<?php
isset($foo) === !is_null($foo);
($foo) === !empty($foo);

isset() と is_null()って完全に判別結果が真逆ですね。
そして empty() と if文にそのまま変数だけ書いた場合も、真逆です。
つまり、null や array() や '0' や '-1' の場合、どう判別されるかっていうゆるい部分は、実は2パターンだけって事ですね。
例えば、$foo が null じゃないって事を判別したくって is_null($foo) === false とか書いちゃうこともあるんですが、これって isset($foo) で十分。
同じように if(!empty($foo)) とか書くくらいなら if($foo) って書けば良いと。


ほんといまさらだとは思うんだけど、知る機会が無かったら意外と知らないかもと思って一応書いてみました。