编译Symfony容器php语法

时间:2017-09-14 12:06:34

标签: php symfony

Symfony编译容器并将其转储到缓存文件夹后,它为我们提供了一个包含大量代表服务的函数的类。

我之前从未见过这种语法,并想知道那个特定的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那边?

请解释我在这里缺少的东西。

2 个答案:

答案 0 :(得分:4)

不同部分:

${ 'stringvalue' }

基本相同
$stringvalue

然后

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

本质上是(因为无论表达式是什么,?:左边的语句都返回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');
}

现在,将各部分放在一起:

检索路由器服务('data_collector.router')(创建或使用存储的引用),将其分配给$_。然后&& false ?: '_'返回var:_的名称,它将最外面的表达式转换为:

// $_ 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)

答案 1 :(得分:0)

这是一个变量变量名称。

Php variables

您可以在运行时定义变量的名称(不仅是值)