操作員('貓王運營商)我這個今天看到在一些PHP代碼::在PHP
$items = $items ?: $this->_handle->result('next', $this->_result, $this);
我不熟悉的?:
運營商正在用在這裏。它看起來像一個三元運算符,但是要評估謂詞是否爲真的表達式已被省略。這是什麼意思?
操作員('貓王運營商)我這個今天看到在一些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;
這將分配如果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 operator。
見the docs:
由於PHP 5.3,就可以離開了三元運算符的中間部分。表達式
expr1 ?: expr3
返回expr1
如果expr1
評估爲TRUE
和expr3
否則。
他們需要一個新的文檔編寫器,因爲不可避免地有人會問expr2發生了什麼。我只是把它弄碎了。 – 2010-01-03 00:33:38
是的,這是PHP 5.3中的新功能。如果測試表達式的值被評估爲TRUE,則返回測試表達式的值;如果評估爲FALSE,則返回替代值。
微妙的錯誤/誤導;兩個操作數都不需要是布爾值。重要的是第一個值是* truthy *,而不是「真」。 – 2015-02-11 21:32:06
@MarkAmery澄清。應該很難以這種方式誤解它。 – Atli 2015-02-17 09:08:57
小心數組。我們必須?
後寫一個檢查變量,因爲:
$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;
這並不回答這個問題,對於任何試圖瞭解何時使用貓王操作員的人來說也沒有用。 – 2015-02-11 21:37:25
@Mark Amery嗯..真的嗎?沒有幫助嗎?你真的用PHP工作,看看數千例使用三元組訪問數組的變量嗎?好吧,我把文本改成「小心數組..」 – voodoo417 2015-02-12 00:08:00
所以null coalesce和elvis是一樣的嗎? – 2016-04-11 03:59:35
另一個重要的考慮:Elvis操作符打破了Zend Opcache標記化進程。我發現這很難!雖然這可能已在更高版本中得到修復,但我可以確認PHP 5.5.38中存在此問題(使用內置的Zend Opcache v7.0.6-dev)。
如果你發現你的某些文件'拒絕'在Zend Opcache中緩存,這可能是其中一個原因......希望這有助於!
確保括號中的變量存在,或者您將引發錯誤。 PHP不會假定它具有「null」或任何值。只是說' – DanMan 2015-08-13 11:10:20
有趣的是,這個答案與維基文章構成遞歸循環,並沒有完全解釋爲什麼它被稱爲「貓王操作符」。 – fayerth 2016-02-24 16:21:01
http://emoticon.wikia.com/wiki/Elvis_Presley – 2016-05-04 06:37:11