了解 IoC 容器和依赖关系注入
我的理解:
- 依赖关系是指 ClassA 的实例需要 ClassB 的实例来实例化 ClassA 的新实例。
- 依赖注入是指 ClassA 通过 ClassA 构造函数中的参数或通过 set~DependencyNameHere~(~DependencyNameHere~ $param) 函数传递 ClassA 的实例。(这是我不完全确定的领域之一)。
- IoC 容器是一个单例类(在任何给定时间只能实例化 1 个实例),其中可以注册为此项目实例化这些类的对象的特定方式。下面是一个链接,该链接指向我试图描述的示例,以及我一直在使用的 IoC 容器的类定义
因此,在这一点上,我开始尝试将IoC容器用于更复杂的场景。截至目前,似乎为了使用IoC容器,我仅限于我想要创建的几乎任何类的has-a关系,这些类具有要在IoC容器中定义的依赖项。如果我想创建一个继承类的类,但前提是父类是以特定方式创建的,它是在 IoC 容器中注册的,该怎么办?
例如:我想创建一个mysqli的子类,但我想在IoC容器中注册这个类,以便仅使用以前在IoC容器中注册的方式构造的父类进行实例化。我想不出一种方法来做到这一点而不重复代码(而且由于这是一个学习项目,我试图让它尽可能保持“纯粹”)。以下是我试图描述的更多例子。
所以这是我的一些问题:
- 我上面试图做的事情是否可能在不破坏OOP的一些原则的情况下实现?我知道在c ++中,我可以使用动态内存和复制构造函数来完成它,但是我无法在php中找到这种功能。(我承认,除了__construct之外,我几乎没有使用任何其他魔术方法的经验,但是从阅读和__clone如果我理解正确,我不能在构造函数中使用它来使被实例化的子类成为父类实例的克隆)。
- 与 IoC 相关的所有依赖项类定义应放在哪里?(我的 IoC.php应该在顶部有一堆require_once('dependencyClassDefinition.php')吗?我的直觉反应是有更好的方法,但我还没有想出一个)
- 我应该在哪个文件中注册我的对象?当前在类定义之后的 IoC.php 文件中执行对 IoC::register() 的所有调用。
- 在注册需要依赖项的类之前,是否需要在 IoC 中注册依赖项?由于在我实际实例化在IoC中注册的对象之前,我不会调用匿名函数,因此我猜不是,但它仍然是一个问题。
- 还有什么我忽略了我应该做或使用的东西吗?我试图一步一步地进行,但我也不知道我的代码是可重用的,最重要的是,对我的项目一无所知的人可以阅读并理解它。