当前位置: 首页 > 知识库问答 >
问题:

PHP Elvis运算符与空合并运算符

浦出野
2023-03-14

有人能解释一下PHP中三元运算符速记(?:)和空合并运算符(??)之间的区别吗?

他们什么时候表现不同,什么时候表现相同(如果发生的话)?

$a ?: $b

VS。

$a ?? $b

共有3个答案

羊舌阎宝
2023-03-14
匿名用户

如果像这样使用快捷方式三元运算符,如果未设置$\u GET['username'],则会引起注意:

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

因此,你必须这样做:

$val = isset($_GET['username']) ? $_GET['username'] : 'default';

空合并运算符等效于上述语句,如果未设置或为空,则将返回“default”:

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

请注意,它不会检查真实性。它仅在设置为且不为null时进行检查。

您也可以这样做,并且将返回第一个定义的(set而不是null)值:

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

现在这是一个合适的凝聚操作符。

陶睿
2023-03-14

在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\u null()检查
        $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; 
        }
  • <代码>?: 就像一扇大门,让任何虚假的东西都能通过,包括空的
  • 正在检查空()!isset(),为空()
  • 缩短三元运算,如<代码>!空($x)$x:$y到$x:$y
  • 如果(!$x){echo$x;},则缩短else{echo$y;} 至回声$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';

李良策
2023-03-14

当您的第一个参数为null时,它们基本上是相同的,只是当您有一个未定义的变量时,null合并不会输出E_NOTICE。PHP 7.0迁移文档这样说:

空合并运算符(??)已添加为语法糖,用于需要将三元与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也会给出相同的响应。

执行代码:https://3v4l.org/McavC

当然,这总是假设第一个参数是null。一旦它不再为空,那么您最终会发现运算符总是返回第一个参数,而?:速记只有在第一个参数是真实的情况下才会返回,这取决于PHP如何将内容类型转换为布尔值。

所以:

$a = false ?? 'f'; // false
$b = false ?: 'g'; // 'g'

然后将$a等于false$b等于'g'

 类似资料:
  • 本文向大家介绍PHP 空合并运算符(??),包括了PHP 空合并运算符(??)的使用技巧和注意事项,需要的朋友参考一下 示例 空合并是PHP 7中引入的新运算符。如果未设置,则该运算符返回其第一个操作数NULL。否则,它将返回其第二个操作数。 下面的例子: 等同于两者: 和: 该运算符也可以被链接(具有右关联语义): 这等效于: 注意: 在字符串连接上使用合并运算符时,请不要忘记使用括号() 这将

  • A recent addition This is a recent addition to the language. Old browsers may need polyfills. 在本文中,我们将值既不是 null 也不是 undefined 的表达式称为“已定义的(defined)”。 空值合并运算符(nullish coalescing operator)的写法为两个问号 ??。 a

  • 问题内容: 有人可以解释PHP中的三元运算符速记()和空合并运算符()之间的区别吗? 它们什么时候表现不同,什么时候以相同的方式表现(如果甚至发生)? VS。 问题答案: 当您的第一个参数为null时,它们基本相同,不同之处在于,当您有未定义的变量时,null合并不会输出。在PHP7.0迁移的文档有这样一段话: 对于需要将三元数与isset()结合使用的常见情况,已将空合并运算符(??)添加为语法

  • 本文向大家介绍Kotlin 空合并/Elvis运算符,包括了Kotlin 空合并/Elvis运算符的使用技巧和注意事项,需要的朋友参考一下 示例 有时希望以if-else方式评估可为空的表达式。Elvis运算符?:可以在Kotlin中用于这种情况。 例如: 如果 data?.first ()或数据本身产生 null 值,则上面的表达式返回“ Nothing here” ,否则返回 data?. f

  • 主要内容:RxJava 合并运算符 介绍,RxJava 合并运算符 示例RxJava 合并运算符 介绍 以下是用于从多个 Observable 创建单个 Observable 的运算符。 运算符 描述 And/Then/When 使用模式和计划中介组合项目集。 CombineLatest 通过指定的函数组合每个 Observable 发出的最新项并发出结果项。 Join 如果在第二个 Observable 发射项目的时间范围内发送,则组合两个 Observable 发

  • 问题内容: PHP中是否存在像C#一样的三元运算符? 在C#中更干净,更短,但是在PHP中,您必须执行以下操作: 问题答案: PHP 7添加了空合并运算符: 您还可以看一下编写PHP三元运算符?的简短方法:(仅PHP> = 5.3) 而且您与C#的比较是不公平的。“在PHP中,您必须做类似的事情”-在C#中,如果您尝试访问不存在的数组/字典项,那么还将出现运行时错误。