PHP - Elvis Vs. Null coalesce 在PHP中,Elvis运算符和Null合并运算符是用于处理变量为空的情况的两种不同方法。 Elvis运算符(?:)用于在变量为空时提供默认值。它的语法如下: ``` $variable = $value ?: $default; ``` 这里的$variable是要被赋值的变量,$value是要检查的变量,$default是在$value为空时要使用的默认值。如果$value不为空,则$variable将被赋值为$value的值,否则它将

23 浏览
0 Comments

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

0
0 Comments

在使用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;。请注意,这不包括''nullfalse0

0
0 Comments

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合并操作符。

0
0 Comments

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

0