[英]?: operator (the 'Elvis operator') in PHP
我今天在一些 PHP 代碼中看到了這一點:
$items = $items ?: $this->_handle->result('next', $this->_result, $this);
我不熟悉這里使用的?:
運算符。 它看起來像一個三元運算符,但是如果謂詞為真,則評估的表達式已被省略。 這是什么意思?
如果左操作數為真,則計算為左操作數,否則為右操作數。
在偽代碼中,
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'
?>
順便說一下,它被稱為Elvis operator 。
查看文檔:
自 PHP 5.3 起,可以省略三元運算符的中間部分。 表達式
expr1 ?: expr3
如果expr1
計算結果為TRUE
則返回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;
另一個重要的考慮因素:Elvis Operator 破壞了 Zend Opcache 標記化過程。 我發現這很難! 雖然這可能已在更高版本中修復,但我可以確認這個問題存在於 PHP 5.5.38(內置 Zend Opcache v7.0.6-dev)。
如果您發現您的某些文件“拒絕”緩存在 Zend Opcache 中,這可能是原因之一...希望這會有所幫助!
是的,這是 PHP 5.3 中的新功能。 如果它被評估為 TRUE,則它返回測試表達式的值,如果它被評估為 FALSE,則返回替代值。
?:
是貓王運算符。 這是一個二元運算符,它執行以下操作:
將?:
左邊的值強制為布爾值並檢查它是否為true
。 如果為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();
func() 中的結果僅在 $a 具有解析為 FALSE 的值時才會執行。 它可以用作縮寫
if(!$a){
func();
}
賦值是可選的 $a = $a?: func() 就像:
if(!$a){
$a = func();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.