313

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

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

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

4

6 回答 6

634

如果左操作数为,则计算左操作数,否则计算右操作数。

在伪代码中,

foo = bar ?: baz;

大致解决为

foo = bar ? bar : baz;

或者

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

差异bar只会被评估一次。

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

foo = foo ?: bar;

这将分配barfooiffoo为 null 或 false,否则它将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'
?>

顺便说一句,它被称为猫王运算符

猫王算子

于 2010-01-03T00:24:22.297 回答
66

请参阅文档

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

于 2010-01-03T00:13:13.240 回答
21

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

  $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;
于 2015-02-10T22:47:17.317 回答
8

另一个重要的考虑因素:Elvis Operator 打破了 Zend Opcache 标记化过程。我发现这很难!虽然这可能已在以后的版本中得到修复,但我可以确认 PHP 5.5.38 中存在此问题(内置 Zend Opcache v7.0.6-dev)。

如果您发现某些文件“拒绝”缓存在 Zend Opcache 中,这可能是原因之一……希望这会有所帮助!

于 2017-02-16T18:10:28.927 回答
5

猫王运营商:

?:是猫王算子。这是一个二元运算符,它执行以下操作:

将左侧的值强制为?:布尔值并检查它是否为true。如果true它将返回左侧的表达式,如果为 false 它将返回右侧的表达式。

例子:

var_dump(0 ?: "Expression not true");     // expression returns: Expression not true
var_dump("" ?: "Expression not true");    // expression returns: Expression not true
var_dump("hi" ?: "Expression not true");  // expression returns string hi
var_dump(null ?: "Expression not true");  // expression returns: Expression not true
var_dump(56 ?: "Expression not true");    // expression return int 56

何时使用:

Elvis 运算符基本上是三元运算符特定情况的简写语法,即:

$testedVar ? $testedVar : $otherVar;

Elvis 运算符将通过以下方式使语法更加简洁:

$testedVar ?: $otherVar;
于 2020-11-05T15:51:27.047 回答
4

是的,这是 PHP 5.3 中的新功能。如果它被评估为 TRUE,它返回测试表达式的值,或者如果它被评估为 FALSE,它返回替代值。

于 2010-01-03T00:13:47.943 回答