2

我见过一些框架在php中实现DI。但是,由于PHP中的所有对象都是在单个请求的生命周期中创建和销毁的,因此我不知道这会如何影响性能。依赖注入,PHP和性能问题

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

我看到一些框架允许惰性DI,所以这应该有助于不需要的实例化。也许分割DI也是解决第一个问题的方法。 那么,DI会不会影响我的PHP应用程序性能,我应该如何去实现DI在PHP中,所以它不会发生?

+6

您的应用程序是否达到了额外开销实际上导致问题的级别?或者,在你编写第一个''标签对之前,你是否担心这一点?开始时不要微观优化。 – 2012-04-12 18:31:13

+0

应用程序遭遇性能问题,部分大修正在重构应用程序,使其更加模块化,引入了di fwks,doctrine 2等,以便更易于维护和优化。我不希望这会引入额外的性能损失。 – Dan 2012-04-12 18:45:20

+0

我不认为决定DI方法/框架是一个微观优化。这是一个应用基础。 – webbiedave 2012-04-12 18:47:04

回答

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,问题会消失吗? (我不这么认为)

国际海事组织的性能考虑因素应该明确指出DI是问题。在应用程序中有很多部分可能会出错。

0

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

嗯,也有延迟初始化,所以这些对象只是轻量级的占位符,并在需要的情况下的功能,在需要的时候,才会创建大对象。

因此,DI会对我的php应用程序性能产生不利影响,我应该如何去实现在php中的DI,所以它不会发生?

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