我有简单的应用程序,我正在尝试开始使用DI容器。我下载了Pimple,研究了代码和文档。过了一会儿,我来到了有趣的事情。我有两个课程,在特殊情况下他们之间进行交流。
class Foo
{
/**
* @var Bar
*/
private $bar;
public function __construct(Bar $bar)
{
$this->bar = $bar;
}
}
class Bar
{
/**
* @var Foo
*/
private $foo;
public function __construct(Foo $foo)
{
$this->foo = $foo;
}
}
我已经定义了Pimple容器,有两个类,如下所示:
$container = new Pimple\Container();
$container['foo'] = function($c)
{
return new Foo($c['bar']);
};
$container['bar'] = function($c)
{
return new Bar($c['foo']);
};
这是var_dumped容器:
object(Pimple\Container)[14]
private 'values' =>
array (size=2)
'foo' =>
object(Closure)[17]
'bar' =>
object(Closure)[18]
private 'factories' =>
object(SplObjectStorage)[15]
private 'protected' =>
object(SplObjectStorage)[16]
private 'frozen' =>
array (size=0)
empty
private 'raw' =>
array (size=0)
empty
private 'keys' =>
array (size=2)
'foo' => boolean true
'bar' => boolean true
问题是,当我创建使用$ container ['foo']时,它会尝试注入需要foo的类Bar,因此最大嵌套出错。我的想法是,为什么没有通过关闭?哪个会在课堂上真正需要的时候执行?
或者我是否容易误解了闭包是什么?