それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Null合体演算子(Null Coalescing)と三項演算子の短縮形(Short-ternary )をまとめておく。

Null合体演算子(Null Coalescing)と三項演算子の短縮形(Short-ternary )を使ってパニクったので整理。

<?php
$a[0]??null #-> この値を知りたい。
比較 結果
unset($a) $a[0] ?? null NULL
$a = null $a[0] ?? null NULL
$a = $a[0] ?? null NULL
$a = ['x'] $a[0] ?? null 'x'
$a = 'abc' $a[0] ?? null 'a'
$a = '' $a[0] ?? null NULL
$a = ['x'] $a[0] ?: null 'x'

更に、細かく調査した結果。

比較 結果
unset($a) $a NULL
unset($a) $a ?? null NULL
unset($a) $a[0] ?? null NULL
$a = null $a NULL
$a = null $a ?? null NULL
$a = null $a[0] ?? null NULL
$a = $a
$a = $a ?? null
$a = $a[0] ?? null NULL
$a = ['x'] $a ['x']
$a = ['x'] $a ?? null ['x']
$a = ['x'] $a[0] ?? null 'x'
$a = 'abc' $a 'abc'
$a = 'abc' $a ?? null 'abc'
$a = 'abc' $a[0] ?? null 'a'
$a = '' $a ''
$a = '' $a ?? null ''
$a = '' $a[0] ?? null NULL
$a = ['x'] $a ?: null ['x']
$a = ['x'] $a[0] ?: null 'x'

更にオブジェクトについても見ておく

比較 結果
$a = null $a->id?? null NULL
$a = [] $a->id?? null NULL
$a = 'x' $a->id?? null NULL
$a = '' $a->id?? null NULL
unset($a) $a->id?? null NULL

特にイメージが湧かないのが、次の場合で。

<?php
$a = [];
$a[0]??null #=>null
$a = null;
$a[0]??null #=>null

ミスってしまいがちなのが、次のように順番をミス。

<?
//Trying to access array offset on value of type null 
$a??$a[0]; // Error. 

正しくは次のように書く。

<?php
$a[0]??$a; // $a が返される。 

配列をAPIで返されるときに、適当にアクセスしたらNULLが山盛りになってパニクった。

参考資料

https://www.php.net/manual/ja/language.operators.comparison.php#language.operators.comparison.coalesce