一尘不染

PHP三元运算符vs空合并运算符

php

有人可以解释PHP中的三元运算符速记(?:)和空合并运算符(??)之间的区别吗?

它们什么时候表现不同,什么时候以相同的方式表现(如果甚至发生)?

$a ?: $b

VS。

$a ?? $b

阅读 319

收藏
2020-05-26

共1个答案

一尘不染

当您的第一个参数为null时,它们基本相同,不同之处在于,E_NOTICE当您有未定义的变量时,null合并不会输出。在PHP7.0迁移的文档有这样一段话:

对于需要将三元数与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如何将内容类型转换为布尔值。

所以:

$a = false ?? 'f'; // false
$b = false ?: 'g'; // 'g'

则将$a等于false$b等于'g'

2020-05-26