我的理解:
- 依赖是指一个 ClassA 实例化新的实例时需要一个 ClassB 实例。
- 依赖注入是指将 ClassB 的实例传递给 ClassA,可以通过 ClassA 构造函数中的参数或通过 set~DependencyNameHere~(~DependencyNameHere~ $param) 函数来实现。 (这是我不完全确定的领域之一)。
- IoC 容器是一个单例类(在任何给定时间只能实例化1个实例),可以在其中注册创建这些类对象的特定方式。 这里有一个示例链接,其中包括我一直在使用的 IoC 容器的类定义和描述。
到目前为止,我开始尝试在更复杂的情况下使用 IoC 容器。目前似乎要使用 IoC 容器,我对于几乎想要创建的任何类都限于具有依赖项,在 IoC 容器中定义该依赖项。如果我想创建继承类,但只有在父类以特定方式被注册在 IoC 容器中创建时,才能创建它怎么办。
例如:我想创建 mysqli 的子类,但我想在 IoC 容器中注册此类,只有在以前在 IoC 容器中注册为特定方式构造的父类创建时才能实例化。我无法想到一个方法来做到这一点而不重复代码(因为这是一个学习项目,我尽可能地保持“纯洁”)。 这里有更多的示例。
因此,这里有一些我的问题:
- 在不违反OOP原则的情况下,我上面尝试的操作是否可行?我知道在C++中,我可以使用动态内存和复制构造函数来完成它,但我没有找到在PHP中实现这种功能的方法。(我承认除了__construct之外,我很少使用任何其他的魔术方法,但从阅读和__clone中,如果我理解正确,我不能在构造函数中使用它将被实例化的子类作为父类实例的克隆)。
- 与IoC相关的所有依赖类定义应该放在哪里?(IoC.php文件只需要在顶部添加一堆require_once(“dependencyClassDefinition.php”)吗?我的直觉告诉我有更好的方法,但我还没有想到一个)
- 我应该在哪个文件中注册我的对象?目前在类定义后的IoC.php文件中执行所有对IoC::register()的调用。
- 在注册需要依赖项的类之前,我需要在IoC中注册该依赖项吗?因为我直到实例化在IoC中注册的对象时才调用匿名函数,所以我猜想不需要,但这仍然是一个问题。
- 还有我忽视的需要做或使用的其他事情吗?我正在逐步进行,但我也希望我的代码可重用,并且最重要的是,任何对我的项目一无所知的人都可以阅读和理解它。
$dic
变量)。Pimple 就是一个美化的关联数组。调用$dic->resolve()
是一种服务定位器,并让您的对象 API 失去了可靠性。尽管您读过 Fowler 和编写清晰代码的文章,但提供 Pimple 和反模式作为解决方案。我认为你需要重新考虑$database =
的那部分……不过很高兴看到有人表示不要使用静态方法 :-) - Jimbo$database = $dic->resolve('database');
和服务定位器的警告似乎没有关联。我并没有意识到使用它会有警告。如果你对这种东西感兴趣,让我来震撼一下你的思维:链接。 - Jimbo$engine->vroom();
拉出一个很旧的记忆,让我想起了 Atari ST 上的 Vroom 游戏,上帝,我喜欢那个游戏,声音在当时是现象级的,无论如何,回到工作中...) - James