用Lample依赖注入容器加载PHP延迟?

时间:2014-11-05 23:12:22

标签: php silex pimple

最近我开始使用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加载依赖项?

1 个答案:

答案 0 :(得分:2)

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

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