我今天在一些PHP代码中看到了这一点:
$items = $items ?: $this->_handle->result('next', $this->_result, $this);
我不熟悉?:
这里使用的运算符。它看起来像一个三元运算符,但是省略了用于评估谓词为true的表达式。这是什么意思?
我今天在一些PHP代码中看到了这一点:
$items = $items ?: $this->_handle->result('next', $this->_result, $this);
我不熟悉?:
这里使用的运算符。它看起来像一个三元运算符,但是省略了用于评估谓词为true的表达式。这是什么意思?
Answers:
用伪代码,
foo = bar ?: baz;
大致解决
foo = bar ? bar : baz;
要么
if (bar) {
foo = bar;
} else {
foo = baz;
}
差异bar
只会被评估一次。
您还可以使用此方法对foo
您发布的代码示例中所示的内容进行“自检” :
foo = foo ?: bar;
这将分配bar
到foo
是否foo
为空或falsey,否则会留下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运算符。
||
。那blah || 'default'
呢
||
运算符总是返回一个布尔值。
见文档:
从PHP 5.3开始,可以省略三元运算符的中间部分。如果计算结果为,则表达式
expr1 ?: expr3
返回,否则返回。expr1
expr1
TRUE
expr3
expr2
是它只是消失了,没有被评估。$this->expensiveComputation() ?: "nope"
与$this->expensiveComputation() ? $this->expensiveComputation() : "nope"
- 不相同-expr1仅评估一次。
小心数组。我们必须在之后编写一个检查变量?
,因为:
$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;
另一个重要的考虑因素:猫王操作员打破了Zend Opcache令牌化过程。我发现这很困难!尽管在更高版本中可能已解决此问题,但是我可以确认PHP 5.5.38(内置Zend Opcache v7.0.6-dev)中存在此问题。
如果您发现某些文件“拒绝”存储在Zend Opcache中,则可能是原因之一...希望这会有所帮助!
是的,这是PHP 5.3中的新功能。如果其值为TRUE,则返回测试表达式的值;如果值为FALSE,则返回替代值。
TRUE
。
null
或任何值。只是