深入thinkphp5.1之Container容器
作为tp框架或者说任何一种框架的核心思想,container类基本上算是框架的灵魂所在。
不得不说的注册树
在thinkphp框架中实现容器概念的无非是:注册树模式+单例模式的结合,单例模式咱就不进行细讲了,应该看过单例的代码的人都基本上能很轻松的掌握,这里讲一下注册树模式。
思想:其实注册树和单例模式的思想基本上相同,但是我们单例模式只是针对一个单独的实例进行操作,注册树更像一个盒子,将要用或者正在调用的实例放在盒子中,同一进程中的下一次请求进入,就不用再去实例化,而是直接在盒子里面进行查找返回。
简单的一个例子:通过类的标识获取到类的实例


其实核心思想很简单,只要将代码管理做到规范,面试的时候就可以和面试官将我深入理解面向对象编程。反复琢磨container类中的代码,你会发现真的不是随随便便的代码都能做框架的代码,这里面的思想和代码质量与咱们的业务代码真的不是一个档次,虽然也不能这么来比较,就当调侃一下。
以上代码基本上就是一个最简陋的注册树代码了。
facade门面模式
本来想用一篇单独文章来写tp5中的门面模式,但是感觉凑不到这么多字数,为了文章的质量,还是决定放在这里来写。门面模式:静态调用类中的非静态方法。挺起来是很高大上的,很多一到三年的开发者对这个门面模式都是不知云云的,要比别人更快的成长,咱就得比别人涉猎得更多。
这里我就不写案例了,直接讲解框架案例

此处调用thinkphp中的内置方法
__callstatic:当类中未发现被调用的静态方法将会调用此函数
__call_user_func_array:调用传入实例类中的非静态方法


到这里就是类中的门面模式
Container类的解读
在上面咱们看到了,其实门面模式如果具体划分也可以不属于tp5的门面模式,最下面的衔接语句是:return Container::getInstance()->make($class,$args,$newInstance):此处的make方法实际相当于注册数模式的get和set方法的结合,make就是container类的核心
主要类:__make的解读下面是图解

对应的代码解读


到此基本上类container解读基本完成