$a ?? 0 等同于 isset($a) ? $a : 0。

通过 isset 判断一个变量是否设置,即使值为 false、0、“0”  ,也会返回 true,只声明未赋值返回 false。

 

$a ?: 0 等同于 $a ? $a : 0。

通过 boolean if($x) 判断一个变量是否有值,但是 null、false、0、“0” ,也都会返回 false,并且 $a 如果没有定义会报错。

 

需要特别注意的是,网上大部分说 ?: 是通过 empty 来判断,这就误导人了,这几个判断方法的区别可以参考:PHP 变量类型比较,使用总结:

$a ?? 0 或 isset($a) ? $a : 0 $a ?: 0 或 $a ? $a : 0
用于判断变量是否已声明并设置值,不论是否为空值。 用于判断变量是否为非空值,变量若未定义会报错。