簡體   English   中英

?: PHP 中的操作員(“貓王操作員”)

[英]?: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM