【发布时间】:2014-09-15 15:07:33
【问题描述】:
我最近了解到在我的 PHP 应用程序中使用依赖注入 (DI) 的优势。
但是,我仍然不确定如何为依赖项创建容器。之前,我使用框架中的容器,我想了解他在后面是如何做事并重现它。
例如:
来自 Zend 2 的容器。我知道容器使类动态化,他不必从一开始就知道它们,他检查他是否已经在他的注册表中拥有该类,如果他没有,他检查是否类存在,构造函数内部有什么参数并将其放入他自己的注册表中,以便下次可以从那里获取它,实际是动态地做所有事情并且它正在完成他自己的注册表,所以我们一旦实现就不必关心任何事情容器,因为他可以提供我们想要的任何课程,即使我们只是制作那个课程。
另外,如果我想为需要 B 和 B 需要 C 的 A 发送 getInstance,我知道他这样做是递归的,他去实例化 C,然后是 B,最后是 A。
所以我了解大局以及他应该做什么,但我不太确定如何实施。
【问题讨论】:
-
我一直在你的位置上,我建议你查看Pimple DI 它是一个单一的类(据我所知)并且相对简单。看看它并了解它是如何工作的。这应该可以帮助您旋转自己的 DIC 变体
-
你能看看我的第一个答案,是我几天前提出的问题后提出的解决方案,但没有人说什么,我仍然不知道是否有什么好处吗,我真的很想听听你的意见,如果你有时间看看。谢谢!
-
我注意到的第一件事是你大量使用反射,你能解释一下为什么吗? (虽然我还没有深入审查它)
-
当然。我的 DIC 处理所有动态,他可以提供您刚刚创建的类的实例,因为当您询问实例时,如果现在检查他是否已经在 $defs 中拥有该类的实例如果该类存在,然后通过反射,我将获取他的所有构造函数参数并为他的每个构造函数参数(依赖项)调用相同的函数,如果我们想要的对象在构造函数中没有任何参数,他会创建新的并将其放入在 $defs 中,所以因为一切都是递归的,所以它会返回,并且每个对象都是在处理完他的依赖项之后生成的。
-
因为我总是需要反射,所以我也做了一个反射数组,这样我就不会每次都进行新的反射。
标签: php dependency-injection frameworks ioc-container