PHP Elvis 运算符与空合并运算符

新手上路,请多包涵

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

他们什么时候表现不同,什么时候表现相同(如果这种情况发生的话)?

 $a ?: $b

VS。

 $a ?? $b

原文由 balping 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 591
2 个回答

当您的第一个参数为空时,它们基本相同,只是当您有未定义的变量时,空合并不会输出 E_NOTICEPHP 7.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 。一旦它不再为空,那么您最终会遇到不同之处,即 ?? 运算符将始终返回第一个参数,而 ?: 速记仅在第一个参数为真时才会返回,并且依赖于 PHP 如何将事物类型转换为 boolean

所以:

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

那么 $a 等于 false$b 等于 'g'

原文由 MasterOdin 发布,翻译遵循 CC BY-SA 4.0 许可协议

实用 的简短回答:

尝试:

 var_dump('' ?: 'ok');

对比

var_dump('' ?? 'ok');


第一个将返回 'ok' 如果测试值(或变量 *评估为 false

然而

第二个将返回 'ok' 如果测试值(或变量 * null _或未初始化/设置_。


*注意:如果你想用 ?: 测试一个 _变量_,你必须首先确保它被初始化/设置,否则 PHP 将引发一个 E_NOTICE (而 ?? 惯于)。

原文由 St3an 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏