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