有人能解释一下PHP 中三元运算符简写( ?:) 和空合并运算符( )之间的区别吗???
?:
??
他们什么时候表现不同,什么时候表现相同(如果这种情况发生的话)?
$a ?: $b
VS。
$a ?? $b
当您的第一个参数为空时,它们基本相同,只是E_NOTICE当您有未定义的变量时,空合并不会输出。PHP 7.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。一旦它不再为空,那么您最终会遇到不同之处,即??运算符将始终返回第一个参数,而?:速记仅在第一个参数为真时才会返回,这取决于PHP 如何将事物类型转换为 boolean。
null
所以:
$a = false ?? 'f'; // false $b = false ?: 'g'; // 'g'
那么$a将等于false和$b等于'g'。
$a
false
$b
'g'