PHP三元运算符vs 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 ,则将返回'default':

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

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

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

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

现在,这是一个合适的合并操作员。


当涉及到动态数据处理时,它们的行为都不一样。

如果变量为空(''),则空合并会将该变量视为true,但速记三元运算符不会。 这是要记住的。

$a = NULL;
$c = '';

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

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

print $c ?? '1d';
print "n";

print $c ?: '2d';
print "n";

print $e ?? '1f';
print "n";

print $e ?: '2f';

输出:

1b
2b

2d
1f

Notice: Undefined variable: e in /in/ZBAa1 on line 21
2f

链接:https://3v4l.org/ZBAa1

链接地址: http://www.djcxy.com/p/9939.html

上一篇: PHP ternary operator vs null coalescing operator

下一篇: coalescing operator custom implicit conversion behaviour