問題
プログラムの改修時、未定義かもしれない配列要素を比較することになった。
if ($foo["bar"] === "hoge") { echo $foo["bar"]; }
このままだとNotice: Undefined indexが発生する
PHP Notice: Undefined index: foo in /workspace/Main.php on line 1
issetを使用すればエラーは回避できるが、if文がネストしてしまう。
if (isset($foo["bar"]) === true) { if ($foo["bar"] === "hoge") { echo $foo["bar"]; } }
なるべくシンプルにコードを記述したい。
方法
null合体演算子
PHP 7以降なら、null合体演算子を利用できる。
比較対象の配列要素が未定義の場合の値をシンプルに設定できる。
$foo = $foo["bar"] ?? ""; if ($foo === "hoge") { echo $foo; }
短絡評価
PHPでは条件分岐を繋げた場合、真偽が確定すると後続の式は評価されない。
上記の評価ルールを短絡評価と言い、これを利用する。
if (isset($foo["bar"]) === true && $foo["bar"] === "hoge") { echo $foo["bar"]; }
シンプルな記述にできるが、条件分岐を増やすため&&が増えると、可読性が落ちていく。
メソッド化してreturn
このブロックをメソッド化してif文を分けてreturnする。
メソッド使用の前提に当てはまらない場合を切り落とす。
xxx($foo); function xxx(array $foo) { if (isset($foo["bar"]) === false) { return; } if ($foo["bar"] === "hoge") { echo $foo["bar"]; } }
大げさな対応方法だが、この部分に特殊な仕様があることを明示することもできる。