?:运营商('Elvis运营商')使用PHP

我今天在一些PHP代码中看到了这一点:

$items = $items ?: $this->_handle->result('next', $this->_result, $this);

我不熟悉在这里使用的?:操作符。 它看起来像一个三元运算符,但是要评估谓词是否为真的表达式已被省略。 这是什么意思?


如果左操作数是truthy,则它评估左操作数,否则评估右操作数。

在伪代码中,

foo = bar ?: baz;

大致解决

foo = bar ? bar : baz;

要么

if (bar) {
    foo = bar;
} else {
    foo = baz;
}

不同的是, bar只会被评估一次。

您也可以使用它来对foo进行“自检”,如您发布的代码示例所示:

foo = foo ?: bar;

如果foo为null或falsey,这会将bar分配给foo ,否则它将使foo保持不变。

更多的例子:

<?php
    var_dump(5 ?: 0); // 5
    var_dump(false ?: 0); // 0
    var_dump(null ?: 'foo'); // 'foo'
    var_dump(true ?: 123); // true
    var_dump('rock' ?: 'roll'); // 'rock'
?>

顺便说一下,它被称为猫王操作员。


查看文档:

从PHP 5.3开始,可以忽略三元运算符的中间部分。 表达式expr1 ?: expr3 expr1如果expr1计算结果为TRUE ,则expr1 ?: expr3返回expr1 ,否则返回expr3


小心数组。 我们必须在写入一个检查变量后? ,因为:

  $params = ['param1' => 'value1',
             'param2' => 'value2',
             'param3' => 'value3',];

  $param1 = isset($params['param1'])?:null;
  $param2 = !empty($params['param2'])?:null;
  $param3 = $params['param3']?:null; // get E_NOTICE, if $params['param3'] eq false

  var_dump($param1,$param2,$param3);
  true // would like to expect `value1`
  true // would like to expect `value2`
  param3 // properly, but problem above

更新

来自RFC。 在将来(在PHP 7中),运算符Null Coalesce Operator将执行此操作,例如:

$param1 = $params['param1'] ?? null;
// Equivalent to:  $param1 = isset($params['param1']) ? $params['param1'] : null;
链接地址: http://www.djcxy.com/p/1735.html

上一篇: ?: operator (the 'Elvis operator') in PHP

下一篇: Should I use @ in my PHP code?