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