動機
空配列, false もしくはデータが入った配列
これを判断し、空配列とfalseの場合、即時falseを返したい。
そのため、以下の書き方をした。
$array = false, もしくは [], もしくは ["a" => "b"];
if(!$array || count($array) == 0) return false;
!$array
が先に来ないと,count(false)
してしまいエラーが出る。
その際に、!$array
って空配列の場合どのような挙動をするのか気になった。
ifで空配列を渡すと実行しない
if([]) echo "not show";
if(["a" => "b"]) echo "show";
ifで空配列を渡してあげると実行しないことがわかった。
つまり以下の方法でも良い
if(!$array) return false;
この記法だと後でバグフィックスするのは骨が折れそう。
個人プロジェクトでよく使う手法
if()
の挙動として、以下のようになる
if("0") echo "not show";
if(0) echo "not show";
if("文字列") echo "show";
if(1) echo "show";
これを使えば、トリッキーだが例外処理等を使用せずに、関数やオブジェクトの戻り値の条件分岐が楽になる。
function ret($i = 0){
if($i == 0) return "moji";
return false;
}
if(ret()) echo "show"; // show
echo (ret()) ?: 'not show this string'; //moji
ただ、php7やphp8で==
やempty
,isset
等の挙動が変わっている。
現状、ifでは文字列や配列を突っ込んでも動いてくれるが、将来の仕様変更を考えるとあまり褒められた方法ではない。
実際に処理している内容は以下のような物と考えるとわかりやすい
if($string == true)
もっと良い解決方法
$array = false, もしくは [], もしくは ["a" => "b"];
if(empty($array)) return false;
そもそも、empty
という関数があるんだからそれ使えよ。と遅まきながら気づいた。
追記2021/02/16
今回紹介したのはif
に直接文字列や配列を入れて判断するものだが、if(
内部)
で判断する場合には更にシビアになる。
PHP ~7
if(0 == "abc") echo "show";
PHP 8~
if(0 == "abc") echo "not show";
これは以下のように処理されていると考えるとわかりやすい
php ~7
if(0 == (int) "abc") echo "show";
まとめると、バージョンの違いにによっては動かなくなる可能性もあるので、
自分でメンテナンスできる環境以外では使わないようにすることを勧める。