2010-01-03 81 views
123

操作員('貓王運營商)我這個今天看到在一些PHP代碼::在PHP

$items = $items ?: $this->_handle->result('next', $this->_result, $this); 

我不熟悉的?:運營商正在用在這裏。它看起來像一個三元運算符,但是要評估謂詞是否爲真的表達式已被省略。這是什麼意思?

回答

237

如果左操作數是truthy,則計算左操作數,否則計算右操作數。

在僞代碼中,

foo = bar ?: baz; 

大致解析爲

foo = bar ? bar : baz; 

if (bar) { 
    foo = bar; 
} else { 
    foo = baz; 
} 

區別在於bar將只計算一次。

您也可以使用該做的foo「自我檢查」爲您發佈的代碼示例演示:

foo = foo ?: bar; 

這將分配如果barfoofoo爲空或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

Elvis operator

+7

確保括號中的變量存在,或者您將引發錯誤。 PHP不會假定它具有「null」或任何值。只是說' – DanMan 2015-08-13 11:10:20

+10

有趣的是,這個答案與維基文章構成遞歸循環,並沒有完全解釋爲什麼它被稱爲「貓王操作符」。 – fayerth 2016-02-24 16:21:01

+0

http://emoticon.wikia.com/wiki/Elvis_Presley – 2016-05-04 06:37:11

42

the docs

由於PHP 5.3,就可以離開了三元運算符的中間部分。表達式expr1 ?: expr3返回expr1如果expr1評估爲TRUEexpr3否則。

+4

他們需要一個新的文檔編寫器,因爲不可避免地有人會問expr2發生了什麼。我只是把它弄碎了。 – 2010-01-03 00:33:38

2

是的,這是PHP 5.3中的新功能。如果測試表達式的值被評估爲TRUE,則返回測試表達式的值;如果評估爲FALSE,則返回替代值。

+2

微妙的錯誤/誤導;兩個操作數都不需要是布爾值。重要的是第一個值是* truthy *,而不是「真」。 – 2015-02-11 21:32:06

+0

@MarkAmery澄清。應該很難以這種方式誤解它。 – Atli 2015-02-17 09:08:57

7

小心數組。我們必須?後寫一個檢查變量,因爲:

$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; 
+1

這並不回答這個問題,對於任何試圖瞭解何時使用貓王操作員的人來說也沒有用。 – 2015-02-11 21:37:25

+3

@Mark Amery嗯..真的嗎?沒有幫助嗎?你真的用PHP工作,看看數千例使用三元組訪問數組的變量嗎?好吧,我把文本改成「小心數組..」 – voodoo417 2015-02-12 00:08:00

+0

所以null coalesce和elvis是一樣的嗎? – 2016-04-11 03:59:35

2

另一個重要的考慮:Elvis操作符打破了Zend Opcache標記化進程。我發現這很難!雖然這可能已在更高版本中得到修復,但我可以確認PHP 5.5.38中存在此問題(使用內置的Zend Opcache v7.0.6-dev)。

如果你發現你的某些文件'拒絕'在Zend Opcache中緩存,這可能是其中一個原因......希望這有助於!