ThinkPHP容器源码深度解析(2)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: ThinkPHP容器源码深度解析

三、如何理解控制反转和依赖注入

其实这俩个就是指的一个东西,就是一种编程思想而已,不要想的那么难以理解和高大上。


那么什么是容器,容器直面理解就是装东西的东西。在编程中,我们常见的变量、对象属性都是一个容器。一个容器里边能够装什么,完全取决于对该容器的定义。


然而现在我们讨论的是另外一种容器,它存储的既不是文本、数值,而是对象、类、接口通过这种容器,得以实现很多高级功能,最常用的就是代码之间的解耦、依赖注入。


那么为什么会存在俩种概念,为什么要说控制反转和依赖注入呢!在上文也提到过,它们其实指的就是一种东西,只是描述的角度不同而已。


就跟你是爸爸的儿子,你还是你爷爷的孙子,不管儿子还是孙子都指的是一个人。只是站在不同的角度看待问题而已。


控制反转


是站在容器的角度看待问题,容器控制着应用程序,由容器反向的向应用程序注入应用程序需要的外部资源。


依赖注入


是站在应用程序的角度看待问题,应用程序依赖容器创建并注入它所需要的外部资源。


作用


主要用来减少代码之间的耦合程度。


有效的分离对象和应用程序所需要的外部资源。


下面俩幅图就可以很清晰的说明问题


image.png

image.png



给大家整一个简单的案例


定义俩个类分别为Person、Car,在Person中实例并调用Car中的pay方法。


image.png


然后在控制器中调用,并且打印结果肯定就是Car返回的123,这个就不去打印了。


image.png



那这个时候我们把代码修改一下,把Car类直接传给Person类,在Person类中直接用传过来的对象去调用对应的方法。


image.png


这只是一个简单的实现过程,为了给阅读框架容器代码做一个铺垫,在后文中会详细说明框架中的容器注入。

四、必会反射机制

不知道大家有没有了解过GO的反射机制,咔咔在当时看了go的反射机制后说实话有点晕乎乎的。


但是在后来看了PHP的反射之后,不仅对go的反射有了一定的深入了解,并且对于PHP的反射也是更好的理解。


反射这一概念是在PHP5.0被引出来的,在目前使用的框架中咔咔知道的就有thinkphp和laravel都使用了反射来实现依赖注入。


对于反射的理解:其实就是从根获取根以外的东西,放在编程中讲就是只要知道一个类就可以知道这个类所有的属性和方法。


案例


这只是一个简单的实现案例,获取类的全部方法和属性。可以看下图中的打印结果跟TestReflection是否一致。

image.png


image.png



这个也从侧面表现出现一个问题,就是会暴露出来一些本不应该暴露出来的信息。


关于反射提供的接口还有很多,这里就介绍几个常用的,其余的在框架源码中解析。


使用反射执行一个类的方法


打印出来的结果就是咔咔

image.png


使用反射执行一个类中带参数的方法


image.png


使用反射执行一个类中不带参数的方法

image.png


其它的方法你们自己可以尝试尝试,因为这个反射的接口在平时基础开发是不怎么用的,这咔咔给大家介绍的都是后边在阅读源码都是可以用的到的。


既然了解到了反射,那么反射可以做什么事情呢!其中有一个功能点自动生成文档。


反射到这里就简单的了解一下,至于还想了解更多的接口使用可以去官方查看对应的接口信息。


image.png


在了解完反射之后就要开始进入正题了,就需要正式进入我们的容器环节了。只有上边的基础打好接下来的容器才能更好的理解。



相关文章
|
13天前
|
XML Java Android开发
Android实现自定义进度条(源码+解析)
Android实现自定义进度条(源码+解析)
47 1
|
17天前
|
存储 NoSQL 算法
【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(字典)(二)
【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(字典)
33 0
|
14天前
|
Kubernetes 网络协议 Docker
Docker 容器的DNS
Docker 容器的DNS
23 1
|
21天前
|
存储 安全 编译器
【C++ 17 泛型容器对比】C++ 深度解析:std::any 与 std::variant 的细微差别
【C++ 17 泛型容器对比】C++ 深度解析:std::any 与 std::variant 的细微差别
44 1
|
26天前
|
Linux C++ iOS开发
VLC源码解析:视频播放速度控制背后的技术
VLC源码解析:视频播放速度控制背后的技术
68 0
|
28天前
|
Python
区域代理分红商城系统开发源码片段示例规则解析
level = Column(Integer, default=1) # 代理等级,例如:1代表普通用户,2代表初级代理,3代表高级代理等 parent_id = Column(Integer, ForeignKey('user.id')) # 上级代理ID 【更全面的开发源码搭建可V or TG我昵称】 parent = relationship("User", remote_side=[id]) # 上级代理对象
|
1月前
|
存储 安全 Java
ArrayList源码全面解析
ArrayList源码全面解析
|
2月前
|
C语言
内核源码中遇到不会解析的宏怎么办?
内核源码中遇到不会解析的宏怎么办?
202 1
|
3月前
ChatGLM2 源码解析:`GLMTransformer`
ChatGLM2 源码解析:`GLMTransformer`
181 0
|
2月前
|
Java 关系型数据库 数据库连接
Spring源码解析--深入Spring事务原理
本文将带领大家领略Spring事务的风采,Spring事务是我们在日常开发中经常会遇到的,也是各种大小面试中的高频题,希望通过本文,能让大家对Spring事务有个深入的了解,无论开发还是面试,都不会让Spring事务成为拦路虎。
33 1

推荐镜像

更多