2017-09-14 65 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