我今天在一些PHP代码中看到了这个:
$items = $items ?: $this->_handle->result('next', $this->_result, $this);
我不熟悉这里使用的?:运算符。它看起来像一个三元运算符,但是省略了如果谓词为真则求值的表达式。这是什么意思?
我今天在一些PHP代码中看到了这个:
$items = $items ?: $this->_handle->result('next', $this->_result, $this);
我不熟悉这里使用的?:运算符。它看起来像一个三元运算符,但是省略了如果谓词为真则求值的表达式。这是什么意思?
当前回答
小心使用数组。我们必须在?之后写一个检查变量,因为:
$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。在php7中,空联合操作符(Null Coalesce operator)将执行此操作,例如:
$param1 = $params['param1'] ?? null;
// Equivalent to: $param1 = isset($params['param1']) ? $params['param1'] : null;
其他回答
小心使用数组。我们必须在?之后写一个检查变量,因为:
$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。在php7中,空联合操作符(Null Coalesce operator)将执行此操作,例如:
$param1 = $params['param1'] ?? null;
// Equivalent to: $param1 = isset($params['param1']) ? $params['param1'] : null;
查看文档:
从PHP 5.3开始,可以省略三元操作符的中间部分。表达式expr1 ?:如果expr1的值为TRUE,则expr3返回expr1,否则返回expr3。
是的,这是PHP 5.3中的新功能。如果测试表达式的值为TRUE,则返回该表达式的值;如果测试表达式的值为FALSE,则返回替代值。
猫王接线员:
?:猫王运算符。这是一个二进制操作符,它的功能如下:
将?:剩余的值强制为布尔值,并检查它是否为真。如果为真,则返回左边的表达式,如果为假,则返回右边的表达式。
例子:
var_dump(0 ?: "Expression not true"); // expression returns: Expression not true
var_dump("" ?: "Expression not true"); // expression returns: Expression not true
var_dump("hi" ?: "Expression not true"); // expression returns string hi
var_dump(null ?: "Expression not true"); // expression returns: Expression not true
var_dump(56 ?: "Expression not true"); // expression return int 56
使用时间:
Elvis操作符基本上是三元操作符特定情况的速记语法,即:
$testedVar ? $testedVar : $otherVar;
Elvis操作符将以以下方式使语法更加简洁:
$testedVar ?: $otherVar;
我认为目的是有条件执行:
$a ?: func();
只有当$a的值解析为FALSE时,func()中的results才会执行。它可以用作…的缩写
if(!$a){
func();
}
赋值是可选的$a = $a ?: func()就像:
if(!$a){
$a = func();
}