小编ech*_*ber的帖子

了解IoC容器和依赖注入

快进:

我写这篇文章的目的是为了更好地理解依赖注入和IoC容器,以及之后我可以纠正它中的错误并用它来帮助教我的一些朋友关于它们.

截至目前,我已经尝试阅读各种框架(laravel,fuel,codeigniter,symfony)的文档,我发现框架中有太多不同的方面,我需要感觉舒服使用它,我决定尝试在尝试在框架中使用它们之前,先单独学习每个主要部分.

我花了几个小时搜索各种含义,查看stackoverflow响应,阅读各种文章试图了解什么是IoC以及如何使用它来正确管理依赖关系,我相信我理解它在概念中是什么,但我仍然是灰色的关于如何正确实现它.我认为阅读本文的任何人帮助我的最好方法是给出我目前对IoC容器和依赖注入的理解,然后让那些比我更了解的人指出我的理解不足的地方.

我的理解:

  • 依赖性是指ClassA的实例需要ClassB的实例来实例化ClassA的新实例.
  • 依赖注入是指ClassA通过ClassA的构造函数中的参数或通过set~DependencyNameHere~(~DependencyNameHere~ $ param)函数传递ClassB的实例.(这是我不完全确定的领域之一).
  • 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中注册的对象,我猜不是,但它仍然是一个问题.
  • 还有什么我忽略了我应该做或正在使用的东西吗?我试图一步一步,但我也不想知道我的代码是可重用的,最重要的是,对我的项目一无所知的人可以阅读并理解它.

我知道这是非常漫长的,只是想提前感谢任何花时间阅读它的人,甚至更愿意分享他们的知识.

php oop inheritance dependency-injection inversion-of-control

60
推荐指数
1
解决办法
2万
查看次数