PHP8に移行していくなかで、新しく実装されたnullsafe演算子がとても便利で使いやすかったので勉強も兼ねてまとめてみようと思います。
Nullsafe演算子
PHP 8.0.0 以降では、プロパティやメソッドは “nullsafe” 演算子 ?-> を使ってアクセスすることもできます。
nullsafe 演算子は既に述べたメソッドやプロパティと同じように振る舞いますが、 オブジェクトが null と評価された場合に、例外はスローされず、 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;
}
}
}
?->
$product = auth()?->user?->getPaidProducts()?->product_id;
nullでなかった場合は通常の->
Null合体演算子
Nullsafe演算子の『?』は三項演算子やNull合体演算子と同じような意味です。2項演算子??がphp7.0から追加されたもので、これはPHP 5.3で導入されたエルビス演算子(三項演算子) ?: と少し似ています。エルビス演算子は真偽の判断を行いますが、??演算子はnullかどうかの判断を行う点が異なっています。
PHP7では、この面倒なissetを書く手間を??演算子で省けます。
$name = $hoge['name'] ?? '';
??の左側がnullでないなら左を返し、nullなら右側を返します。便利ですね。

最近のコメント