?:运营商('Elvis运营商')使用PHP
我今天在一些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;
如果foo
为null或falsey,这会将bar
分配给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'
?>
顺便说一下,它被称为猫王操作员。
查看文档:
从PHP 5.3开始,可以忽略三元运算符的中间部分。 表达式expr1 ?: expr3
expr1
如果expr1
计算结果为TRUE
,则expr1 ?: expr3
返回expr1
,否则返回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;
链接地址: http://www.djcxy.com/p/1735.html