我已经看到许多框架在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 以免它发生?
每一行代码都会影响应用程序性能,因此无论您做什么,都需要处理它。如果您真的关心性能,则应从缓存应用程序的输出开始,以便除非需要,否则无需加载任何代码。