【PHP】Notice: Undefined indexを解決しつつ条件分岐を追加する

問題

プログラムの改修時、未定義かもしれない配列要素を比較することになった。

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"];
    }
}

大げさな対応方法だが、この部分に特殊な仕様があることを明示することもできる。

カテゴリーPHP

コメントを残す

メールアドレスが公開されることはありません。