ワイズリマインダー

phpでもJavaScriptのオプショナルチェーン演算子風な書き方ができた

JavaScriptを書いていると、オプショナルチェーン演算子にかなり助けられます。

const adventurer = {
  name: "Alice",
  cat: {
    name: "Dinah",
  },
};

const dogName = adventurer.dog?.name;
console.log(dogName);
// 予想される結果: undefined

存在しないプロパティにアクセスしてもエラーにならず、undefined を返してくれる便利な書き方です。
一度慣れると、もう手放せません。

 

PHPを書いた瞬間に起きるストレス

ところがPHPに戻ると、同じことをしようとして毎回こうなります。

if ($repository !== null) {
    $user = $repository->getUser(5);
    if ($user !== null) {
        $result = $user->name;
    }
}

「長い。」
やりたいのは nullチェック だけなのに、コードの大半が防御処理になります。
JavaScriptの ?. が恋しくなる瞬間です。

 

配列なら Null 合体演算子

PHPでは配列の場合、比較的シンプルに書けます。

$dogName = $adventurer['dog']['name'] ?? null;

?? を使えば、値が存在しない場合でもエラーになりません。
ただしこれは 配列限定。
オブジェクトになると事情が変わります。

 

配列の場合、Null合体演算子を使う

$dogName = $adventurer['dog']['name'] ?? null;

 

PHP8から使える「nullsafe演算子」

PHP8.0以降なら、実はJavaScriptにかなり近い書き方ができます。

$result = $repository?->getUser(5)?->name;

途中で null が出た時点で処理を止め、結果を null にしてくれます。
つまり、次の冗長なコードと同じ意味になります。

if (is_null($repository)) {
    $result = null;
} else {
    $user = $repository->getUser(5);
    if (is_null($user)) {
        $result = null;
    } else {
        $result = $user->name;
    }
}

 

JavaScript脳の人ほど嬉しい

この書き方の良いところは、
「存在チェックを書く」という意識が消えること。
処理の本質だけに集中できます。
JavaScriptとPHPを行き来する人ほど、コードの認知負荷が下がるはずです。

 

地味だけどコード品質が上がる

nullsafe演算子を使うと、
・ネストが減る
・可読性が上がる
・バグポイントが減る
という副作用があります。
機能としては小さいですが、日常的なコードではかなり効きます。

 

まとめ

JavaScriptのオプショナルチェーンに慣れているなら、PHP8以降では同じ感覚で書けます。

配列 → ??
オブジェクト → ?->

PHPもだいぶ現代的になってきました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

検索

最近のコメント

最近の投稿

タグ

フィード配信

アーカイブ

外部リンク