三、如何理解控制反转和依赖注入
其实这俩个就是指的一个东西,就是一种编程思想而已,不要想的那么难以理解和高大上。
那么什么是容器,容器直面理解就是装东西的东西。在编程中,我们常见的变量、对象属性都是一个容器。一个容器里边能够装什么,完全取决于对该容器的定义。
然而现在我们讨论的是另外一种容器,它存储的既不是文本、数值,而是对象、类、接口通过这种容器,得以实现很多高级功能,最常用的就是代码之间的解耦、依赖注入。
那么为什么会存在俩种概念,为什么要说控制反转和依赖注入呢!在上文也提到过,它们其实指的就是一种东西,只是描述的角度不同而已。
就跟你是爸爸的儿子,你还是你爷爷的孙子,不管儿子还是孙子都指的是一个人。只是站在不同的角度看待问题而已。
控制反转
是站在容器的角度看待问题,容器控制着应用程序,由容器反向的向应用程序注入应用程序需要的外部资源。
依赖注入
是站在应用程序的角度看待问题,应用程序依赖容器创建并注入它所需要的外部资源。
作用
主要用来减少代码之间的耦合程度。
有效的分离对象和应用程序所需要的外部资源。
下面俩幅图就可以很清晰的说明问题
给大家整一个简单的案例
定义俩个类分别为Person、Car,在Person中实例并调用Car中的pay方法。
然后在控制器中调用,并且打印结果肯定就是Car返回的123,这个就不去打印了。
那这个时候我们把代码修改一下,把Car类直接传给Person类,在Person类中直接用传过来的对象去调用对应的方法。
这只是一个简单的实现过程,为了给阅读框架容器代码做一个铺垫,在后文中会详细说明框架中的容器注入。
四、必会反射机制
不知道大家有没有了解过GO的反射机制,咔咔在当时看了go的反射机制后说实话有点晕乎乎的。
但是在后来看了PHP的反射之后,不仅对go的反射有了一定的深入了解,并且对于PHP的反射也是更好的理解。
反射这一概念是在PHP5.0被引出来的,在目前使用的框架中咔咔知道的就有thinkphp和laravel都使用了反射来实现依赖注入。
对于反射的理解:其实就是从根获取根以外的东西,放在编程中讲就是只要知道一个类就可以知道这个类所有的属性和方法。
案例
这只是一个简单的实现案例,获取类的全部方法和属性。可以看下图中的打印结果跟TestReflection是否一致。
这个也从侧面表现出现一个问题,就是会暴露出来一些本不应该暴露出来的信息。
关于反射提供的接口还有很多,这里就介绍几个常用的,其余的在框架源码中解析。
使用反射执行一个类的方法
打印出来的结果就是咔咔
使用反射执行一个类中带参数的方法
使用反射执行一个类中不带参数的方法
其它的方法你们自己可以尝试尝试,因为这个反射的接口在平时基础开发是不怎么用的,这咔咔给大家介绍的都是后边在阅读源码都是可以用的到的。
既然了解到了反射,那么反射可以做什么事情呢!其中有一个功能点自动生成文档。
反射到这里就简单的了解一下,至于还想了解更多的接口使用可以去官方查看对应的接口信息。
在了解完反射之后就要开始进入正题了,就需要正式进入我们的容器环节了。只有上边的基础打好接下来的容器才能更好的理解。