ThinkPHP容器源码深度解析
- 前言
- 一、单例模式
- 二、注册树模式
- 三、如何理解控制反转和依赖注入
- 四、必会反射机制
- 五、玩转自己的容器类
- 六、Container容器类剖析之Countable巧用
- 七、Container容器类剖析
- 八、容器源码阅读后总结
前言
在这之前已经剖析过了类的自动加载、配置文件加载的源码解析,本文为第三期的文章,主要针对容器以及门面类的实现,解析源码。以及学习实现此功能的一些知识点。
第一期文章:ThinkPHP自动加载Loader源码分析
第二期文章:ThinkPHP配置文件源码分析
一、单例模式
在学习容器以及门面之前需要必须了解的俩个设计模式,单例模式、注册树模式。
先对单例模式做一个简单的说明。
- 拥有一个构造函数,并且属性为private
- 拥有一个静态成员变量来保存类的实例
- 拥有一个静态方法来访问这个实例
一下就是咔咔实现的一个简单的单例模式,对照一下上面的三大特性看是否一致。
静态变量为instance
拥有构造并且还是私有的
最后一个就是有一个getInstance这个静态方法
接下来进行一下简单的测试
还是在index控制器中做测试,为了证实其类只被实例化过一次,调用了其四次
访问这个方法来看一下
new-class只执行了一次,就直接证明了创建的类只实例化了一次。
在这里咔咔之前有过一个疑问就是,这里的构造函数为什么要使用私有的属性。
你之前有过这个疑问吗?咔咔带你一起来解答一下
在本类定义私有属性的构造方法是为了防止其类在外部被实例化。
当在外部实例化这个类就会报下图的错。
那么为什么会在这里提一嘴单例模式呢!是因为在接下来的学习容器的源码中会使用到
例如下图thinkphp/library/think/Container.php类中就存在一个获取当前容器的实例。
截止到这里单例模式就简单的了解完了,了解单例模式也是为了更好的理解容器。
二、注册树模式
为什么在这里说这个注册树模式,因为在框架中注册树模式就是一个主导位置,所以必须去了解它!
那什么是注册树模呢!
注册树模式就是将对象实例注册到一颗树上(这里的树可不是真的树啊!就是注册到一个全局的属性里边)
然后可以通过内部方法从全局的树上获取对应的对象实例。
这样说的话肯定也不能更好的理解,接下来咔咔带大家看一个简单的案例来简单的了解一下。
一个注册树模式需要的东西就是四个,注册树的池子,将对象挂载到注册池里,从注册池里获取对象,从注册池里卸载对象。
如下图是咔咔写的一个简单的注册树模式。
代码如果看不懂的就需要去补补基础了哈!
接下来在到同一目录创建一个TestTree文件
来到控制器测试写的注册树模式是否有问题
在做测试的时候一定要注意命名空间问题哈!这里的kaka目录是之前在类的自动加载哪里配置的,如有不会的可以去第一期文章查看。
这里就相当于先把TestTree这个类实例化出来
然后使用注册树模式把这个实例注册到object树池子中
最后使用get方式将这个类获取出来就可以直接调用TestTree中的方法了。
最后看一下最终打印结果,结果就是TestTree类中getTreeContent方法的返回值。
注册树模式就是以上咔咔说明的这些内容,就是不去针对源码学习,这些内容也是我们必须要去学会使用的。