当您的第一个参数为null时,它们基本相同,不同之处在于,
E_NOTICE当您有未定义的变量时,null合并不会输出。在PHP7.0迁移的文档有这样一段话:
对于需要将三元数与isset()结合使用的常见情况,已将空合并运算符(??)添加为语法糖。如果它存在且不为NULL,则返回其第一个操作数;否则返回第一个操作数。否则返回第二个操作数。
这是一些示例代码来演示这一点:
<?php$a = null;print $a ?? 'b'; // bprint "n";print $a ?: 'b'; // bprint "n";print $c ?? 'a'; // aprint "n";print $c ?: 'a'; // Notice: Undefined variable: c in /in/apAIb on line 14print "n";$b = array('a' => null);print $b['a'] ?? 'd'; // dprint "n";print $b['a'] ?: 'd'; // dprint "n";print $b['c'] ?? 'e'; // eprint "n";print $b['c'] ?: 'e'; // Notice: Undefined index: c in /in/apAIb on line 33print "n";注意的行是我使用速记三元运算符而不是空合并运算符的行。但是,即使有此通知,PHP也会给出相同的响应。
执行代码:https :
//3v4l.org/McavC
当然,这总是假设第一个参数是
null。一旦它不再为null,则最终会出现以下差异:
??运算符将始终返回第一个参数,而
?:简写方式只有在第一个参数为true时才返回,并且这取决于PHP如何将内容类型转换为布尔值。
所以:
$a = false ?? 'f'; // false$b = false ?: 'g'; // 'g'
则将
$a等于
false和
$b等于
'g'。



