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
那边?
请解释我在这里缺少的东西。
答案 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)