ブログ
 

php8新機能 Nullsafe演算子はどう使う?

       

PHP8に移行していくなかで、新しく実装されたnullsafe演算子がとても便利で使いやすかったので勉強も兼ねてまとめてみようと思います

Nullsafe演算子

PHP 8.0.0 以降では、プロパティやメソッドは “nullsafe” 演算子 ?-> を使ってアクセスすることもできます。

nullsafe 演算子は既に述べたメソッドやプロパティと同じように振る舞いますが、 オブジェクトが null と評価された場合に、例外はスローされず、 null が返される点だけが異なります。 オブジェクトの評価がチェインの一部だった場合は、 残りのチェインはスキップされます。

この演算子の働きは、 オブジェクトにアクセスするたびに is_null() でラップするコードに似ています。 しかし、よりコンパクトです。

if (!is_null(auth())) {
   $user = auth()->user;

   if (!is_null($user)) {
      $paid_products = $user->getPaidProducts();

      if (!is_null($paid_products)) {
         $product = $paid_products->product_id;
      }
   }
}

Nullsafe演算子?->を使うと、以下のように書けます。

$product = auth()?->user?->getPaidProducts()?->product_id;

演算子の左側がnullだった場合はチェーン全体の実行が停止され、nullが返ります。 nullでなかった場合は通常の->と全く同じ動作になります。

Null合体演算子

Nullsafe演算子の『?』は三項演算子やNull合体演算子と同じような意味です。2項演算子??がphp7.0から追加されたもので、これはPHP 5.3で導入されたエルビス演算子(三項演算子) ?: と少し似ています。エルビス演算子は真偽の判断を行いますが、??演算子はnullかどうかの判断を行う点が異なっています。

$name = isset($hoge['name']) ? $hoge['name'] : '';

PHP7では、この面倒なissetを書く手間を??演算子で省けます。

 $name = $hoge['name'] ?? '';

??の左側がnullでないなら左を返し、nullなら右側を返します。便利ですね。

 
  • このエントリーをはてなブックマークに追加