PHP Elvis 运算符 vs null 合并运算符空合并运算符 ??使用 ??堆垛空煤运算符三元算子 ?:使用 ?:堆叠三元运算符将两者堆叠起来,我们可以缩短这个:对此:很酷,对吧?:-)
2022-08-30 05:52:22
当你的第一个参数为 null 时,它们基本上是相同的,只是当你有一个未定义的变量时,null 合并不会输出 。PHP 7.0 迁移文档是这样说的:E_NOTICE
空聚结运算符 (??) 已添加为语法糖,用于需要将三元与 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也会给出相同的响应。
当然,这总是假设第一个参数是 。一旦它不再为空,那么你最终会得到差异,因为运算符总是返回第一个参数,而速记只会在第一个参数是真实的时才返回,这取决于PHP如何将事物类型转换为布尔值。null
??
?:
所以:
$a = false ?? 'f'; // false
$b = false ?: 'g'; // 'g'
然后等于 并等于 。$a
false
$b
'g'
在php交互模式(终端上)上运行了以下内容。每行上的注释显示结果。php -a
var_export (false ?? 'value2'); // false
var_export (true ?? 'value2'); // true
var_export (null ?? 'value2'); // value2
var_export ('' ?? 'value2'); // ""
var_export (0 ?? 'value2'); // 0
var_export (false ?: 'value2'); // value2
var_export (true ?: 'value2'); // true
var_export (null ?: 'value2'); // value2
var_export ('' ?: 'value2'); // value2
var_export (0 ?: 'value2'); // value2
??
??
就像一个只允许 NULL 通过的“门”。NULL
。??
( !isset() || is_null() )
??
!isset() || is_null()
$object = $object ?? new objClassName();
$v = $x ?? $y ?? $z;
// This is a sequence of "SET && NOT NULL"s:
if( $x && !is_null($x) ){
return $x;
} else if( $y && !is_null($y) ){
return $y;
} else {
return $z;
}
?:
?:
就像一个门,让任何虚假的东西
通过 - 包括NULL
0
empty string
NULL
false
!isset()
empty()
X ? Y : Z
?:
PHP NOTICE
unset
!isset()
?:
empty()
!isset()
is_null()
!empty($x) ? $x : $y
$x ?: $y
if(!$x) { echo $x; } else { echo $y; }
echo $x ?: $y
echo 0 ?: 1 ?: 2 ?: 3; //1
echo 1 ?: 0 ?: 3 ?: 2; //1
echo 2 ?: 1 ?: 0 ?: 3; //2
echo 3 ?: 2 ?: 1 ?: 0; //3
echo 0 ?: 1 ?: 2 ?: 3; //1
echo 0 ?: 0 ?: 2 ?: 3; //2
echo 0 ?: 0 ?: 0 ?: 3; //3
// Source & Credit: http://php.net/manual/en/language.operators.comparison.php#95997
// This is basically a sequence of:
if( truthy ) {}
else if(truthy ) {}
else if(truthy ) {}
..
else {}
if( isset($_GET['name']) && !is_null($_GET['name'])) {
$name = $_GET['name'];
} else if( !empty($user_name) ) {
$name = $user_name;
} else {
$name = 'anonymous';
}
$name = $_GET['name'] ?? $user_name ?: 'anonymous';