?: PHP 中的运算符(“Elvis 运算符”)

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

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

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


答案 1

如果左操作数是真实的,则它向左操作数求值,否则向右操作数求值。

在伪代码中,

foo = bar ?: baz;

大致解析为

foo = bar ? bar : baz;

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

差异只会评估一次。bar

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

foo = foo ?: bar;

这将分配给 if 为 null 或 falsey,否则它将保持不变。barfoofoofoo

更多例子:

<?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'
?>

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

Elvis operator


答案 2

请参阅文档

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


推荐