PHP三值运算符与空合并运算符

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (125)

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

他们什么时候行为不一样,什么时候以相同的方式工作?

$a ?: $b

VS.

$a ?? $b
提问于
用户回答回答于

当你的第一个参数为null时,它们基本上是相同的,只是E_NOTICE当你有一个未定义的变量时,空合并不会输出。在PHP 7.0迁移的文档有这样一段话:

空合并运算符(??)已被添加为需要与isset()一起使用三元组的通常情况下的语法糖。它返回它的第一个操作数,如果它存在并且不是NULL; 否则返回第二个操作数。

这里有一些示例代码来演示这个:

<?php

$a = null;

print $a ?? 'b';
print "\n";

print $a ?: 'b';
print "\n";

print $c ?? 'a';
print "\n";

print $c ?: 'a';
print "\n";

$b = array('a' => null);

print $b['a'] ?? 'd';
print "\n";

print $b['a'] ?: 'd';
print "\n";

print $b['c'] ?? 'e';
print "\n";

print $b['c'] ?: 'e';
print "\n";

它的输出:

b
b
a

Notice: Undefined variable: c in /in/apAIb on line 14
a
d
d
e

Notice: Undefined index: c in /in/apAIb on line 33
e

有通知的行是我使用速记三元运算符而不是空合并运算符。但是,即使有通知,PHP也会给出同样的回应。

执行代码:https//3v4l.org/McavC

当然,这总是假设第一个参数是null。一旦它不再为空,那么最终会出现差异,即??运算符总是返回第一个参数,而?:只有第一个参数是真的时,速记才会返回,并且依赖于PHP将如何输入事件到布尔值

所以:

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

然后$a会等于false$b等于'g'

用户回答回答于

使用这样的快捷三元运算符,如果$_GET['username']没有设置则会引起通知:

$val = $_GET['username'] ?: 'default';

所以,你必须做这样的事情:

$val = isset($_GET['username']) ? $_GET['username'] : 'default';

空合并运算符是等同于上面的语句,将返回“默认”,如果$_GET['username']没有设置或者是null

$val = $_GET['username'] ?? 'default';

请注意,它不检查真实性。它只检查它是否设置,而不是空值。

你也可以这样做,并且返回第一个定义的(set和not null)值:

$val = $input1 ?? $input2 ?? $input3 ?? 'default';

扫码关注云+社区

领取腾讯云代金券