PHP中的?:运算符('Elvis运算符')

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

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

我不熟悉在这里使用的?:操作符。 它看起来像一个三元运算符,但是如果谓词是真的,那么expression式就被省略了。 这是什么意思?

如果左边的操作数是truthy ,则计算左边的操作数,否则计算右边的操作数。

在伪代码中,

 foo = bar ?: baz; 

大致解决

 foo = bar ? bar : baz; 

要么

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

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

你也可以用这个来做一个foo的“自检”,如你发布的代码示例所示:

 foo = foo ?: bar; 

如果foo为null或falsey,将会为foo分配bar ,否则会使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开始,可以省略三元运算符的中间部分。 expression式expr1 ?: expr3 expr1如果expr1计算结果为TRUE ,则expr1 ?: expr3返回expr1 ,否则返回expr3

小心数组。 我们必须写一个检查variables? ,因为:

  $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; 

是的,这是PHP 5.3中的新function。 如果testingexpression式的值被评估为TRUE,则返回testingexpression式的值;如果评估为FALSE,则返回替代值。

另一个重要的考虑:猫王操作符打破了Zend Opcache标记化过程。 我发现这很难! 虽然这可能已经在更高版本中得到修复,但我可以确认PHP 5.5.38中存在这个问题(使用内置的Zend Opcache v7.0.6-dev)。

如果你发现你的一些文件“拒绝”在Zend Opcache中caching,这可能是其中一个原因…希望这有助于!