【问题标题】:PHP Lazy loading with Pimple Dependency Injection Container?PHP延迟加载与Pimple Dependency Injection Container?
【发布时间】:2014-11-05 23:12:21
【问题描述】:

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

【问题讨论】:

    标签: php silex pimple


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-30
      • 2018-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多