12
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHP の null 合体演算子から isset の真価を知る

12
Posted at

他の言語は経験あるけど PHP は初心者って感じの人は ?? を使って

$book = Book::where('name', "みんなのPHP")->first();

if (
    // そんな本はないかもしれない
    $book !== null &&
    // そんなフィールドは null かもしれない
    $book->metadata !== null &&
    // array にそんなキーはないかもしれない
    isset($book->metadata->customFields['PHP文庫特集']) &&
    $book->metadata->customFields['PHP文庫特集'] === "掲載"
) {
    // 松下幸之助特集も御覧ください
}

こう書けると考える。

$book = Book::where('name', "みんなのPHP")->first();

if (
    // そんな本はないかもしれない
    $book !== null &&
    // そんなフィールドは null かもしれない
    $book->metadata !== null &&
    // array にそんなキーはないかもしれない
    // null 合体した: isset($book->metadata->customFields['PHP文庫特集']) &&
    $book->metadata->customFields['PHP文庫特集'] ?? null === "掲載"
) {
    // 松下幸之助特集も御覧ください
}

実はこう書ける。

$book = Book::where('name', "みんなのPHP")->first();

if ($book->metadata->customFields['PHP文庫特集'] ?? null === "掲載") {
    // 松下幸之助特集も御覧ください
}

isset() は関数ではなく構文要素 (未定義または null 評価にならないかチェックする言語機能) なので、内部の式を評価しないからヌルポを起こさない。つまり ?? がなくても実は最初からこう書くことができた。

$book = Book::where('name', "みんなのPHP")->first();

if (
    // そんな本はないかもしれないし、フィールドは null かもしれないし、array にそんなキーはないかもしれない
    isset($book->metadata->customFields['PHP文庫特集']) &&
    $book->metadata->customFields['PHP文庫特集'] == "掲載"
) {
    // 松下幸之助特集も御覧ください
}

知識は要るけど実用性つよい言語設計ですね。

12
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?