TP5源码:IOC容器及Facade 深度解析(一)

知识点目录:

        1.单例设计模式

        2.注册树模式

        3.依赖注入(DI)

        4.php反射机制

        5.自定义容器类(上述4者融合)

        6.分析tp5.1的容器类


1.单例设计模式:

        目的:在整个项目中,一个类只有一个实例

        一个懒汉式的单例设计模式(烂大街了,还是截个图放上去吧)

TP5源码:IOC容器及Facade 深度解析(一)_第1张图片

2. 注册树模式:

        注册树模式通过将对象实例注册到一颗全局的树上

        需要的时候从对象树上摘下来使用  (最简单版,后期细说)

TP5源码:IOC容器及Facade 深度解析(一)_第2张图片

3.依赖注入

        依赖注入只要用来减少代码间的耦合

        有效分离对象和它所需的外部资源        

TP5源码:IOC容器及Facade 深度解析(一)_第3张图片

4.php的反射机制:

        通俗说法:根据一个对象,知道它所属的类,拥有哪些方法,属性,注释等

        在PHP中,反射是指在PHP运行状态中,扩展分析PHP程序,导出或者提取出关于类、属性、方法、参数等的详细信息,包括注释。这种动态获取信息以及动态调用对象方法的功能,被称为反射API。

TP5源码:IOC容器及Facade 深度解析(一)_第4张图片

5.自定义容器类:

        如下图所示,我们将car类注入到person类中,通过person类的buy方法调用car类的pay方法

TP5源码:IOC容器及Facade 深度解析(一)_第5张图片

        我们的person类与car类

TP5源码:IOC容器及Facade 深度解析(一)_第6张图片

        大头的 Container类

TP5源码:IOC容器及Facade 深度解析(一)_第7张图片

        这里需要注意容器类的get方法(通过反射机制拿到类的构造函数,注入所需参数)

TP5源码:IOC容器及Facade 深度解析(一)_第8张图片

6. 分析tp5.1的容器类:

        这里居然需要到thinkphp目录下执行git checkout 5.1,否则Contaier.php不出现(我也是醉了)

        如下图所示,Container类实现了ArrayAccess接口(php内置接口:可以让对象像数组一样用中括号调用),IteratorAggregate(聚合式迭代器),Countable(php内置接口:继承Countable接口的可被用于count() 函数,就是可以这样写count($class)),以及反射类等

TP5源码:IOC容器及Facade 深度解析(一)_第9张图片

        下图为tp框架容器类源码(ps:跟明哥上面的demo差不多)

TP5源码:IOC容器及Facade 深度解析(一)_第10张图片

        从tp框架入口文件开始分析:

TP5源码:IOC容器及Facade 深度解析(一)_第11张图片

        详情请看明哥的源码注释。。

TP5源码:IOC容器及Facade 深度解析(一)_第12张图片

        最后的总结图:

TP5源码:IOC容器及Facade 深度解析(一)_第13张图片

        实际上这三者最后打印的内容都是等价的

你可能感兴趣的:(TP5源码:IOC容器及Facade 深度解析(一))