PHP中的?:运算符('Elvis运算符')
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP中的?:运算符('Elvis运算符')相关的知识,希望对你有一定的参考价值。
我今天在一些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;
如果bar
为null或falsey,这将指定foo
到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'
?>
顺便说一句,它被称为Elvis operator。
见the docs:
从PHP 5.3开始,可以省略三元运算符的中间部分。如果
expr1 ?: expr3
评估为expr1
,则表达式expr1
返回TRUE
,否则返回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;
另一个重要的考虑因素:Elvis运营商打破了Zend Opcache令牌化过程。我发现这很难!虽然这可能已在更高版本中修复,但我可以确认PHP 5.5.38中存在此问题(使用内置的Zend Opcache v7.0.6-dev)。
如果您发现某些文件“拒绝”在Zend Opcache中缓存,这可能是其中一个原因...希望这会有所帮助!
是的,这是PHP 5.3中的新功能。如果它被评估为TRUE,则返回测试表达式的值,如果将其评估为FALSE,则返回替代值。
以上是关于PHP中的?:运算符('Elvis运算符')的主要内容,如果未能解决你的问题,请参考以下文章