共计 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 文件全副获取到,而后进行遍历一个一个进行加载。