使用Pimple依赖项注入容器延迟加载PHP?

使用Pimple依赖项注入容器延迟加载PHP?,php,silex,pimple,Php,Silex,Pimple,最近我开始使用粉刺(和Silex一起使用)。根据Pimple的使用方式,它可以是服务定位器,也可以是依赖项注入容器。 我知道为什么应该避免使用服务定位器模式。然而,有一件事似乎一直困扰着我,那就是创建依赖实例的时刻 在依赖项注入的情况下,将创建所需类的实例并将其传递给构造函数: class Foo{ public $depend1; public $depend2; public function __construct($depend1, $depend2) {

最近我开始使用粉刺(和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的依赖项?

在大多数情况下,这不是问题。如果初始化依赖项成为一个实际的性能问题,您应该将服务拆分为两个独立的服务,或者创建一个代理,在第一次调用时懒散地加载依赖项

有一个PHP库提供自动代理生成,名为。在不了解您的需求的情况下,我的第一个猜测是,这对您来说可能太过分了。在确定有一个实际的性能瓶颈可以通过这种方式解决之前,不要担心这一点