ThinkPHP框架执行流程源码解析(3)

简介: ThinkPHP框架执行流程源码解析

四、对容器中的对象实例进行更新配置

在上一节中这里就是最后的内容,那这个对实例进行更新配置,到底更新了什么,怎么更新没有说明。


在这一小节中就会做出说明,同样可以配合着前言的思维导图看。


  • 先会把config目录下的所有配置信息全部获取出来
  • 从app配置文件中将注册异常处理类
  • 第三大块是把第一步获取出来的所有配置信息给对应的类进行注册配置。
  • 第四步就是在把模块确定下来之后加载对应的语言包,语言包功能就可以实现多语言功能,之前咔咔写过一篇文章实现多语言功能,如果感兴趣的可以去查看。
  • 最后一步就是根据app配置文件中的三个属性进行缓存的处理


在这一节中咔咔感觉最重要的就是下图的内容了。


image.png


我们可以随意追踪一到俩个方法查看一下那边到底执行了什么方法。


追踪方法Db::init()


追踪方法过来后可以看到就是对Db类中的config属性进行赋值,把database中的值赋值给Db类中的config属性。


image.png


追踪方法$this->middleware->setConfig()


来到中间件这个类里边,可以看到就是把本类的配置和传递过来的参数类进行合并,同样也是进行config属性的赋值。


跟上边案例的Db类的init方法实现的效果是一致的。


这里在提一嘴就是在对容器中的对象实例进行更新配置这一幅图中可以看到紫色部分是在本类中没有引用的。


那么这是怎么可以进行执行的呢!是因为App类继承了容器类,容器类中有四个魔术方法,其中有一个__get方法,就是在获取不存在的属性时会执行那个方法。


在魔术方法__get方法中执行了一个make方法,这个make方法说了好多次了,这个方法最终会返回一个应用的实例,然后用这个实例调用对应实例类的方法。


这一块一定要理解好,阅读源码就是这个样子,我们需要对一切未知的进行的解决,只有这样才能提高我们的编程能力和思想。


image.png


五、浅谈调试模式以及代码冗余

本节会对调试模式做出简单的说明,并且会对框架代码冗余情况进行简单的提出。


没有人写的代码是没有漏洞的,如果有那就是你还没有达到一定的造诣。


调试模式


在第一节中只提到了initialize方法的上半部分,因为在这一节之前聊的都是关于应用初始化init的内容。


接下来会对这一块的内容进行简单的说明。


  • 从app配置文件中获取到app_debug的配置项
  • 给环境变量设置debug级别
  • 当框架中的debug是关闭状态时会执行ini_set这个方法,这个方法是为一个配置选项进行赋值。

接下来的内容估计不是很好理解,都是平时在工作中根本使用不到的。


  • ob_get_level:返回输出缓冲机制的嵌套级别,那么怎么去理解呢!其实就是当缓存区不起作用时会返回0。
  • ob_get_clean:这个函数将会返回输出缓冲的内容并终止输出缓冲。如果缓冲区没有有效内容则返回false。本质上相当于同时执行了ob_getcontens()和ob_end_clean()。
  • ob_start:打开输出控制缓冲

上边这三个先暂时认识就行,后期如果有机会会专门出一篇文章做解释的。


image.png


关于框架代码冗余


这里也仅仅代表咔咔个人的观点。


可以先看看这部分的代码,这俩处代码是不是很是熟悉,没错就是在上文的init方法中容器对象实例配置更新见到过。


image.png


如图


image.png


这块也就是咔咔个人提出的见解,由于咔咔式针对5.1做的源码解读,不太了解新版版是否做出了改动。


六、总结

本节主要是针对框架执行流程中的初始化应用做了简单的探讨。


至于在app类的run方法下面还有很多的执行过程在这一节中没有做过多的解释。


在阅读源码的过程中给大家提了一个很好得小技巧,那就是如何去查看一个方法都在哪里进行了执行。


这个方法为debug_backtrace,这个方法需要大家多使用几次就知道怎么使用了,因为在打印出来的结果中也存在很多无用的信息。


这个方法在调试源码的过程中是非常有效的,一定要好好利用这个方法。


在就是对初始化应用init方法进行了特别详细的介绍。


其中咔咔感觉这块设计最好的就是在容器中的对象实例进行更新配置那一块,先读取所有的配置,然后在通过各个类的方法进行配置的设置。


这种代码规划和设计思路值得我们去学习。


最后聊到了调试模式和框架的代码冗余问题,关于调试模式这里咔咔给大家提个醒项目在线上的调试模式一定要关闭。


否则你的项目就类似于裸奔的存在,没有一点点的安全可言。


这块有点不好理解的就是对于缓冲区,关于这块的内容咔咔认为暂时没有必要去钻牛角尖,先认识认识然后在进行深入的研究。


缓冲区的这块内容估计工作了三四年的也很少有人使用,所以先认识,知道怎么一回事,咔咔后期学习了之后在给大家进行补充。


直到这里关于框架的执行流程之初始化应用就结束了,这一节没有过深需要学习的,主要是其中的代码设计模式和实现思路。


最后这个图大家一定要跟着源码看一看哈!


image.png

相关文章
|
2天前
|
XML 人工智能 Java
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
|
10天前
yolo-world 源码解析(六)(2)
yolo-world 源码解析(六)
19 0
|
10天前
yolo-world 源码解析(六)(1)
yolo-world 源码解析(六)
13 0
|
10天前
yolo-world 源码解析(五)(4)
yolo-world 源码解析(五)
22 0
|
24天前
|
XML Java Android开发
Android实现自定义进度条(源码+解析)
Android实现自定义进度条(源码+解析)
52 1
|
28天前
|
存储 NoSQL 算法
【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(字典)(二)
【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(字典)
46 0
|
10天前
yolo-world 源码解析(五)(1)
yolo-world 源码解析(五)
31 0
|
10天前
yolo-world 源码解析(二)(2)
yolo-world 源码解析(二)
21 0
|
10天前
Marker 源码解析(二)(3)
Marker 源码解析(二)
16 0

推荐镜像

更多