PHP Elvis 运算符 vs null 合并运算符空合并运算符 ??使用 ??堆垛空煤运算符三元算子 ?:使用 ?:堆叠三元运算符将两者堆叠起来,我们可以缩短这个:对此:很酷,对吧?:-)

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

他们什么时候表现得不同,什么时候以同样的方式(如果发生这种情况)?

$a ?: $b

与。

$a ?? $b

答案 1

当你的第一个参数为 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也会给出相同的响应。

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

当然,这总是假设第一个参数是 。一旦它不再为空,那么你最终会得到差异,因为运算符总是返回第一个参数,而速记只会在第一个参数是真实的时才返回,这取决于PHP如何将事物类型转换为布尔值null???:

所以:

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

然后等于 并等于 。$afalse$b'g'


答案 2

在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
  • 任何虚假的内容: , , , , , ,0empty stringNULLfalse!isset()empty()
  • 与旧的三元运算符相同:X ? Y : Z
  • 注意:将抛出未定义( 或 )变量?:PHP NOTICEunset!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';

很酷,对吧?:-)


推荐