te13

PHP 8: null 安全な演算子

(CJP) 過去に null 合体演算子を使用したことがある場合は、おそらくその欠点にも気付いているでしょう: null 合体はメソッド呼び出しでは機能しません。 代わりに、中間チェックが必要です。 optional 一部のフレームワークによって提供されるヘルパー:

$startDate = $booking->getStartDate();

$dateAsString = $startDate ? $startDate->asDateTimeString() : null;

nullsafe オペレーターは、null 合体に似た機能を提供しますが、メソッド呼び出しもサポートします。 これを書く代わりに:

$country = null;

if ($session !== null)
$user = $session->user;

if ($user !== null)
$address = $user->getAddress();

if ($address !== null)
$country = $address->country;

PHP 8 では、次のように記述できます。

$country = $session?->user?->getAddress()?->country;

この新しいオペレーターができることとできないことを見てみましょう!

# Nullsafe 演算子の詳細

最も重要な質問に取り組むことから始めましょう: null 合体演算子と nullsafe 演算子の正確な違いは何ですか?

この例を見てみましょう。

class Order

public ?Invoice $invoice = null;

$order = new Order();

ここに Order と任意の関係を持つオブジェクト Invoice 物体。 ここで、請求書の番号を取得したいとします (請求書が null でない場合)。 これは、null 合体演算子と nullsafe 演算子の両方で行うことができます。

var_dump($order->invoice?->number);
var_dump($order->invoice->number ?? null);

違いは何ですか? この例では、両方の演算子を使用して同じ結果を得ることができますが、一方だけが処理できる特定のエッジ ケースもあります。 たとえば、null 合体演算子を配列キーと組み合わせて使用​​できますが、nullsafe 演算子はそれらを処理できません。

$array = [];

var_dump($array[‘key’]->foo ?? null);
var_dump($array[‘key’]?->foo);

Warning: Undefined array key “key”

一方、nullsafe 演算子はメソッド呼び出しを処理できますが、null 合体演算子はできません。 想像してみてください Invoice 次のようなオブジェクト:

class Invoice

public function getDate(): ?DateTime

$invoice = new Invoice();

nullsafe 演算子を使用して呼び出すことができます format 請求書の日付に null:

var_dump($invoice->getDate()?->format(‘Y-m-d’));

null 合体演算子はクラッシュしますが、次のようになります。

var_dump($invoice->getDate()->format(‘Y-m-d’) ?? null);

Fatal error: Uncaught Error: Call to a member function format() on null

# 短絡

null 合体演算子または nullsafe 演算子のいずれかを使用できる場合もあれば、特定の演算子を使用する必要がある場合もあります。 違いは、nullsafe 演算子が「短絡」の形式を使用することです。 ?-> PHP は、この演算子の左側にあるものを調べます。 null その場合、右側は単純に破棄されます。 null 合体演算子は、実際には isset 短絡をサポートしていない左側のオペランドで変装して呼び出します。

短絡とは、次のようなものを書くときにも意味します。

$foo?->bar(expensive_function());

expensive_function 場合にのみ実行されます $foo 実際にはありません null.

# ネストされた nullsafe 演算子

次のように、いくつかの nullsafe 演算子の呼び出しをネストすることができます。

$foo?->bar?->baz()?->boo?->baa();

# データ読み込み専用

nullsafe 演算子を使用してデータをオブジェクトに書き込むことはできません。

$offer?->invoice?->date = new DateTime();

tpyoに気づきましたか? PR を送信して修正することができます。 このブログの最新情報を知りたい場合は、私をフォローしてください。 ツイッター または私のニュースレターを購読してください:

nullsafe 演算子は、最終的に PHP に追加されたパズルの欠けているピースであることは間違いありません。 そのダイナミックな性質を考えると、スムーズに対処する方法があるのは気分が良い null. nullsafe 演算子と null 合体演算子の違いと重複は、最初は少し混乱するように感じますが、きっと慣れると思います。

次の投稿
1月に植える6つの花
前の投稿
大人の水泳に関する「ユール・ログ」: キャスパー・ケリーのインタビュー

ノート:

AZ: 動物の世界、ペット、ペット、野生の自然に関するカテゴリー記事…
SP:スポーツカテゴリー。
New vs Ne: ニュースコラム。
Te: テクノロジー カテゴリ。
Gt:エンターテインメントカテゴリー。
Bt: 占い、星占い、超常現象、超常現象。
Ta:人生コラム。