依赖注入,PHP和性能问题

时间:2012-04-12 18:27:31

标签: php dependency-injection inversion-of-control ioc-container

我已经看到很多框架在php中实现了DI。但是,由于php中的所有对象在单个请求的生命周期内都被创建和销毁,我想知道这会如何影响性能。

通常,您将在DI容器中定义许多对象。在php中,即使Controller不需要大多数这些对象,它们仍然会被实例化。 此外,如果您在php文件中声明DI依赖项,则将加载所有引用的脚本。没有DI,你只需要加载你需要的东西。

我已经看到一些框架允许延迟DI,所以这应该有助于不需要的实例化。也许分段DI也是解决第一个问题的一种方法。 那么,DI会对我的php应用程序性能产生不利影响吗?我应该如何在php中实现DI,这样才不会发生?

2 个答案:

答案 0 :(得分:0)

  

通常,您将在DI容器中定义许多对象。在php中,即使Controller不需要大多数这些对象,它们仍然会被实例化。

嗯,还有延迟初始化,因此这些对象只是轻量级占位符,如果需要功能,只有在需要时才会创建大对象。

  

那么,DI会对我的php应用程序性能产生负面影响吗?我应该如何在php中实现DI,这样才不会发生?

每行代码都会影响应用程序性能,因此无论您做什么,都需要处理它。如果你真的关心性能,你应该从缓存应用程序的输出开始,这样就不需要加载任何代码,除非你需要。

答案 1 :(得分:0)

你必须确定是否存在问题,然后是什么问题。

  • 您是否有需要大量资源和时间构建的依赖项?

您可以使用延迟注入,例如:

class Class1 {
    /**
     * @Inject(lazy=true)
     * @var Class2
     */
    private $class2;

    public function doSomething() {
        // The dependency is loaded NOW
        return $this->class2->getSomethingElse();
    }

(来自PHP-DI的例子)

  • 您的课程中是否有太多依赖项?

你必须问自己,依赖注入是否真的是问题所在。如果您在创建新实例(或使用单身人士)而不是使用DI的情况下,问题会消失吗? (我不这么认为)

IMO性能考虑因素应明确指出DI是问题所在。在应用程序中有很多部分可能出错。