他の言語は経験あるけど 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文庫特集'] == "掲載"
) {
// 松下幸之助特集も御覧ください
}
知識は要るけど実用性つよい言語設計ですね。