最近我开始使用 Pimple(和 Silex 一起)。根据 Pimple 的使用方式,它可以是服务定位器或依赖注入容器。我知道应该避免使用服务定位器模式的原因。然而,似乎困扰我的一件事是创建依赖实例的那一刻。
在依赖注入的情况下,创建所需类的实例并将其传递给构造函数:
class Foo{
public $depend1;
public $depend2;
public function __construct($depend1, $depend2) {
$this->depend1=$depend1;
$this->depend2=$depend2;
}
public function task1() {
return $this->depend1->run();
}
public function task2() {
return $this->depend2->run();
}
}
如果我们将容器本身传递给类构造函数,则在需要它们之前不需要创建依赖实例。
class Foo{
public $app;
public function __construct(\Silex\Application $app) {
$this->app=$app;
}
public function task1() {
return $app['depend1']->run();
}
public function task2() {
return $app['depend2']->run();
}
}
结果,即使我们只调用 Foo 类的两个方法之一,在第一个示例中,仍然会创建两个依赖实例。这段代码是一个非常简单的示例,但我希望在具有更多依赖结构的更复杂的类的情况下问题会增加。我确实注意到其他一些依赖注入容器使用代理类,但找不到该库的任何内容。有没有更好的选择来延迟加载 Pimple 的依赖项?