关于php:Tp5源码分析第五步框架执行流程

48次阅读

共计 1641 个字符,预计需要花费 5 分钟才能阅读完成。

初始化利用的数据设置

Thinkphp 框架执行的时候,首先会执行入口文件,而后执行 app 的 run() 办法,在 run 办法外面,首先会进行初始化利用,调用 initialize() 办法。

首先对 initialized 属性进行判断,是否本类中存在这个属性或者这个属性是否是 true,如果存在或者是 true 就返回,如果不存在, 就对这个属性赋值为 true。而后去设置一系列属性,开始工夫,根目录门路,缓存文件门路,路由文件门路,配置文件门路等等。而后执行 setInstance 进行设置实例,把 $this 的属性放到这个实例外面。在入口文件外面,调用 app 的时候曾经进行实例化,然而没有传入属性,在这里二次调用的目标就是把属性放入到实例中去。

而后调用 instance 办法,进行新的实例化并把 app 放入属性中去。下一步就是进行加载环境变量配置文件.env 文件,如果存在就加载,不存在就进行 config_ext.php 加载。接着加载治理配置文件 convention.php, 它在 thinkphp 目录下。通过 env 实例,应用 set 进行设置门路环境变量。而后设置 namespace,如果没有就设置默认的命名空间 app。接着进行注册利用命名空间,通过 Loader 类的 addNamespace 办法进行注册。最初初始化利用 init。

首先开启类名后缀,而后利用调试模式。首先通过容器的 env 的类,对应的是 think 下的 env.php 文件,而后通过 get 形式获取,如果没有的话,就调用 app.app_debug 配置项,在 config\app.php 文件中,而后把这个值赋给环境变量 app_debug。而后判断这个值是 true 还是 false,如果是 false,就批改 ini 配置文件里的 display_errors 为 off,如果是 true,就从新申请一块比拟大的 buffer。

接下来就是加载各种配置文件,根命名空间注册等等一系列操作。

初始化 init 剖析

init 办法在被调用的时候会被屡次调用,第一次在 initialize 办法的注册利用命名空间之后的时候,调用了 init 办法,第二次在 run 办法的路由监测的时候调用。咱们能够应用 debug_backtrace() 办法进行打印去找到这两个办法调用的地位。

init 办法首先去定位模块的目录,依据传入 $module 参数去查找。而后查找 init.php 文件是否在 application 目录,在的话间接加载;不在的话看 runtime 目录下有没有,而后加载 init.php 文件,如果没有的话进行各种配置文件加载。例如 application 目录下的 common.php(公共文件)、provider.php(注册服务的容器对象实例)、config.php(配置文件) 和 thinkphp 目录下的 helper.php(助手函数文件) 以及中间件文件 middleware.php 文件.

下面执行之后,$dir 就把所有加载的文件门路赋值进来,而后对它进行文件是否存在判断。接着进行后缀判断,看是否存在在 configExt 中,存在的话进行 load 办法解决。接着把 $path 传递给 setModulePath 办法。进行模块门路设置。最初对容器中的对象实例进行配置更新。

首先获取 config 内容,而后注册异样解决类,而后获取各种配置信息。加载语言包,查看缓存。
对之前获取的配置进行更新。

路由初始化简略剖析

在 initialize 办法最初有一个路由初始化,调用了 routeInit 办法。
咱们来看一下 route 文件夹下的 route 目录。

它的执行逻辑就是援用 Route,而后找到 thinkphp\library\think 目录下的 Route,而后调用 get 办法,进行注册路由,不止有 get,还有 post、any、put 等等。

在这里进行路由监测,看一下在根目录下是否存在 route 目录,如果存在,就把 route 目录下的 php 文件全副获取到,而后进行遍历一个一个进行加载。

路由 Route 类中 rule 办法执行形式脑图

路由脑图

正文完
 0