PHP - Elvis Vs. Null coalesce 在PHP中,Elvis运算符和Null合并运算符是用于处理变量为空的情况的两种不同方法。 Elvis运算符(?:)用于在变量为空时提供默认值。它的语法如下: ``` $variable = $value ?: $default; ``` 这里的$variable是要被赋值的变量,$value是要检查的变量,$default是在$value为空时要使用的默认值。如果$value不为空,则$variable将被赋值为$value的值,否则它将
PHP - Elvis Vs. Null coalesce 在PHP中,Elvis运算符和Null合并运算符是用于处理变量为空的情况的两种不同方法。 Elvis运算符(?:)用于在变量为空时提供默认值。它的语法如下: ``` $variable = $value ?: $default; ``` 这里的$variable是要被赋值的变量,$value是要检查的变量,$default是在$value为空时要使用的默认值。如果$value不为空,则$variable将被赋值为$value的值,否则它将
有人能解释一下PHP中的三元运算符简写(?:)和空值合并运算符(??)之间的区别吗?它们何时以不同的方式运行,何时以相同的方式运行(如果有的话)?\n$a ?: $b\nVS.\n$a ?? $b
在使用PHP的三元运算符时,如果$_GET['username']
未设置,会导致一个通知的出现。因此,需要使用如下方式进行处理:
$val = isset($_GET['username']) ? $_GET['username'] : 'default';
而null合并运算符与上述语句等效,并且如果$_GET['username']
未设置或为null
,则返回'default':
$val = $_GET['username'] ?? 'default';
注意,它不会检查真值。它只会检查是否设置并且不为null。
还可以使用如下方式,返回第一个已定义(即设置且不为null
)的值:
$val = $input1 ?? $input2 ?? $input3 ?? 'default';
这就是一个正确的合并运算符。
为了避免生成通知,应该使用$var = empty($other_var) ? 'default_value' : $other_var;
。请注意,这不包括''
、null
、false
和0
。
PHP - Elvis Vs. Null coalesce
在PHP中,有两个类似的操作符 - Elvis操作符(??)和Null合并操作符(?:),它们都用于简化代码并提高可读性。本文将介绍这两个操作符的原因和用法,并通过示例展示它们的功能。
Null合并操作符(??)是一个“门”,只允许NULL通过。它的作用是返回第一个参数,除非第一个参数为NULL。换句话说,它相当于一个逻辑判断,判断一个变量是否设置或是否为NULL。下面是一些示例:
var_export (false ?? 'value2'); // false var_export (true ?? 'value2'); // true var_export (null ?? 'value2'); // value2 var_export ('' ?? 'value2'); // "" var_export (0 ?? 'value2'); // 0
Elvis操作符(?:)是一个“门”,它允许任何假值通过,包括NULL。它的功能与旧的三元操作符相同,即判断条件是否为真,如果为真则返回第一个参数,否则返回第二个参数。但需要注意的是,如果未定义(未设置或未初始化)的变量使用了Elvis操作符,将会抛出PHP NOTICE错误。下面是一些示例:
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合并操作符可以简化代码,不需要使用!isset() || is_null()进行判断,例如:
$object = $object ?? new objClassName();
使用Elvis操作符可以简化空判断操作,例如:
$x ?: $y
上述代码等同于:
!empty($x) ? $x : $y
这两个操作符也可以进行嵌套使用,例如:
$v = $x ?? $y ?? $z;
上述代码等同于:
if( $x && !is_null($x) ){ return $x; } else if( $y && !is_null($y) ){ return $y; } else { return $z; }
总结起来,Null合并操作符用于简化NULL判断,Elvis操作符用于简化空判断,它们都可以大大提高代码的可读性和简洁性。但需要注意的是,Elvis操作符在使用未定义变量时会抛出PHP NOTICE错误,因此在这种情况下,仍然需要使用!empty()或isset()进行判断。
希望本文可以帮助大家更好地理解和使用PHP中的Elvis操作符和Null合并操作符。
PHP中的Elvis运算符(?:)和Null合并运算符(??)之间的区别以及出现的原因和解决方法。
Elvis运算符(?:)在第一个参数包含一个“真值”(请参阅Loose comparisons with ==表中与true松散相等的值)时返回第一个参数。否则返回第二个参数。Null合并运算符(??)在第一个参数设定且不为空时返回第一个参数。否则返回第二个参数。
当第一个参数为null时,它们基本上是相同的,只是当使用未定义的变量时,Null合并运算符不会输出E_NOTICE。PHP 7.0迁移文档中有这样的说明:
"Null合并运算符(??)被添加为语法糖,用于常见的需要与isset()一起使用三元运算符的情况。如果第一个参数存在且不为null,则返回第一个参数;否则返回第二个参数。"
以下是一些示例代码来展示这一点:
$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";
在使用简写的三元运算符而不是Null合并运算符时,会出现提示的行。然而,即使有提示,PHP也会返回相同的结果。
当然,这是基于第一个参数为null的情况。一旦不再为null,那么就会出现差异,Null合并运算符将始终返回第一个参数,而Elvis简写只有在第一个参数为真值时才会返回。这依赖于PHP如何将事物类型转换为布尔值。
所以:
$a = false ?? 'f'; // false $b = false ?: 'g'; // 'g'
将使得$a等于false,$b等于'g'。
提示:如果您已经在PHP 7之后使用??而现在需要使您的代码与旧于7的PHP版本兼容(例如插件),那么您可能需要将代码中的所有??替换为isset($something) ? $something : $something_else。您可以使用Notepad++或nedit(和其他编辑器)的查找/替换工具轻松实现此目标,选择正则表达式选项,并在查找字段中插入:“\s*(\S+)\s*\?\?”,并在替换字段中插入:“isset($1) ? $1 :”(nedit使用\1而不是$1)。然后替换所有。
需要注意的是,您可以在链式中使用??。例如:$b = []; var_dump($b['a']['b']['c'] ?? 'default');
或使用对象:$b = new Foo; var_dump($b->a()->b()->c() ?? 'default');
请注意,对于$a = [];
,行为也与之不同。参见:3v4l.org/iCCa0