PHP 中 ?? 与 ?: 的区别

先下结论。对于 ?: 是根据 empty() 函数对表达式 oper1 判断真假,oper1 为真时,返回 oper1 的结果,否则返回 oper2 的结果。对于 ?? 只有当 oper1 为 null 的时候,才返回 oper2 的结果,否则总返回 oper1 的结果。

oper1 ?? oper2;
oper1 ?: oper2;

下面是 PHP 手册中对 empty 函数判断为空的情况

  • “” (空字符串)
  • 0 (作为整数的0)
  • 0.0 (作为浮点数的0)
  • “0” (作为字符串的0)
  • NULL
  • FALSE
  • array() (一个空数组)
  • $var; (一个声明了,但是没有值的变量)

下面是自测的例子

oper1       oper2   结果
0 ?? 1; 0
0 ?: 1; 1
[] ?? 1; array
[] ?: 1; 1
null ?? 1; 1
null ?: 1; 1
false ?? 1; false
false ?: 1; 1
"" ?? 1; ''
"" ?: 1; 1
"0" ?? 1; '0'
"0" ?: 1; 1
0.0 ?? 1; 0.0
0.0 ?: 1; 1