依赖注入,PHP和性能问题


Dependency Injection, PHP and performance concerns

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

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

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

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

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

您可以使用惰性注入,如下所示:

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是问题所在。应用程序中有很多部件可能会出错。

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

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

那么,DI 是否会对我的 php 应用程序性能产生不利影响,我应该如何在 php 中实现 DI 以免它发生?

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