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,这可能是其中一个原因…希望这有助于!