前言
如果不清楚框架是怎么执行的,那么看在多的代码都是只是认识代码而已,阅读源码是为了学习其框架的设计思想和代码模式。
而执行流程则是将我们学习的东西串联在一起,从而更好地理解。咔咔也会给大家把执行流程用思维导图的方式画出来。
只要大家在本文学习到一点点的知识点,咔咔也是心满意足的。
这个流程图只是针对initialize的执行过程,其余的执行过程后期会进行补充,都是以脑图的形式呈现给大家的。
一、框架执行流程之初始化应用的数据设置
这里的内容跟容器的内容有点重复,因为执行流程是从入口文件开始的,并且最后也是通过容器执行的。
然后就会进入到文件thinkphp/library/think/App.php的run方法,在这个方法中主要就是下图框出来的地方,执行的initialize方法。
来到initialize这个方法,先看上半部分。
microtime(true);返回的是unix的微秒数
memory_get_usage返回的是分配给PHP的内存量,单位为字节
在接下来就是对框架的几个路径进行设置
static::setInstance($this);这里是将app这个实例设置为容器实例
$this->instance('app', $this);这个在之前容器章节就提到了,就是为了把app这个类绑定到容器里边去,也就是注册树模式。
这里有一个小的问题点给大家提出来,在初始化应用的这个方法里边存在这样一行代码。
有没有小伙伴对这个$this->env和下边的$this->config这俩个调用有疑惑。
如果你有疑惑那就跟着咔咔一起来看,没疑惑的就可以继续往下看了。
App这个类是继承的容器类,那么这个env和config不论是在app还是container类中都是没有这俩个属性的。
那么怎么就可以直接调用呢!而且代码追踪都会追踪到env类和container类中。
需要知道这个源头就需要我们去在大致的看一遍container类的代码。
经过一番苦读之后,可以看到下图的几行代码。这几行代码全部使用的是魔术方法。
当访问env类不存在的时候就会去执行make方法。
make这个方法在容器那一章节进行的细的不能再细的解读了。
这个make方法最终会返回一个类的实例,并且还会存到容器里边。
这里只放一个make方法的代码,如果有不会的可以去看之前的文章。
最后就是加载一系列的数据,加载详情请看前言的思维导图。
二、如何查看一个方法都在哪里执行了
在阅读源码的过程中,有一个很难把控的问题就是一个方法在不同的地方进行了调用,但是咱们确一时半会根本不知道都在哪里调用了。
这里用init方法来做一个演示。
init方法是初始化应用或者模块的一个方法,但是这里的module参数确实一个空值。
先做一个断点查看一下相关的数据信息。
打印的结果就是空,这就是一些新学习的伙伴会犯的一个错误,因为这个方法不可能只调用一次的。
如果初始化模块都是空那么这个方法就没有存在的必要了。
那么正确的断点方式应该是这个样子的。