2017-09-14 19 views
0

在Symfony編譯容器並將其轉儲到緩存文件夾後,它向我們提供了一個包含許多代表服務的函數的類。編譯Symfony容器php語法

我從來沒有見過這之前語法,不知道那個特定的lambda函數實際上返回:

protected function getDebug_EventDispatcherService() 
{ 
    // ... 

    $instance->addListener('kernel.controller', array(0 => function() { 
      return ${($_ = isset($this->services['data_collector.router']) ? $this->services['data_collector.router'] : $this->get('data_collector.router')) && false ?: '_'}; 
    } 
    // ... 
    ); 

    return $instance; 
} 

首先:這是什麼語法return ${...}以及它是如何工作的?我知道這叫做Complex (curly) syntax,但這裏不是字符串的一部分,對嗎?

:花括號內的邏輯表達式基本上是以下${(//...) && false ?: '_'}。爲什麼我們在那邊需要那個false

請解釋我在這裏失蹤的內容。

+0

第一部分是一個變量http://php.net/manual/en/language.variables.variable.php對錶達式的評價還不太確定 – Steve

回答

4

不同部位的名稱(而不是隻值):

${ 'stringvalue' } 

是基本相同

$stringvalue 

then

($_ = [expression] && false ?: '_') 

本質上是(因爲無論表達,離開了statment的?:返回false,那麼返回右側):

$_ = [expression]; 
return '_'; // only, it doesn't really return 

和最後但並非最不重要的[expression]

isset($this->services['data_collector.router']) 
    ? $this->services['data_collector.router'] 
    : $this->get('data_collector.router') 

是:

if(isset($this->services['data_collector.router'])) { 
    return $this->services['data_collector.router']; 
} else { 
    return $this->get('data_collector.router'); 
} 

n將零件放在一起:

路由器服務('data_collector.router')被檢索(創建或使用存儲的參考),它被分配到$_。然後&& false ?: '_'返回變種的名稱:_,果然最外表達成:

// $_ was just given a value 
return $_; 

所以整體的代碼是有些等效於:

if(isset($this->services['data_collector.router'])) { 
    $_ = $this->services['data_collector.router']; 
} else { 
    $_ = $this->get('data_collector.router'); 
} 
return $_; 

希望這有助於; O)

+0

很好的解釋,謝謝!但爲什麼不只是使用'return isset($ this-> services ['data_collector.router'])?$ this-> services ['data_collector.router']:$ this-> get('data_collector.router'))'? –

+0

@starnzd我真的不知道。 – Jakumi