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