0
0

More than 3 years have passed since last update.

ifで空配列を渡すと実行しない

Last updated at Posted at 2021-02-05

動機

空配列, 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";

まとめると、バージョンの違いにによっては動かなくなる可能性もあるので、
自分でメンテナンスできる環境以外では使わないようにすることを勧める。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0