当前位置: 首页 > 后端技术 > PHP

Tp5源码分析第五步--------框架执行流程

时间:2023-03-29 14:25:03 PHP

初始化应用数据设置。Thinkphp框架在执行时,会先执行入口文件,然后再执行app的run()方法。在run方法里面,首先会初始化应用程序,然后会调用initialize()方法。首先判断初始化的属性,这个属性在这个类中是否存在或者这个属性是否为true,如果存在或者为true则返回,如果不存在则给这个属性赋值为true。然后设置一系列的属性,启动时间,根目录路径,缓存文件路径,路由文件路径,配置文件路径等等。然后执行setInstance设置实例,把$this的属性放到这个实例中。在入口文件中,app调用的时候已经实例化了,但是没有传入属性,这里第二次调用的目的是将属性放入实例中。然后调用实例方法,进行新的实例化并将app放入属性中。接下来就是加载环境变量配置文件.env文件,存在则加载,不存在则加载config_ext.php。然后加载管理配置文件convention.php,在thinkphp目录下。通过env实例,使用set设置path环境变量。然后设置命名空间,如果没有设置默认命名空间app。然后注册应用命名空间,通过Loader类的addNamespace方法注册。最后初始化应用程序init。首先启用类名后缀,然后应用调试模式。先传容器的env类,对应think下的env.php文件,再通过get获取。如果没有,调用config\app.php文件中的app.app_debug配置项,然后把这个值赋值给环境变量app_debug。然后判断这个值是真还是假。如果为false,修改ini配置文件中的display_errors为off。如果为真,则重新申请更大的缓冲区。接下来就是加载各种配置文件、根命名空间注册等一系列操作。初始化init分析init方法在调用时会被调用多次。第一次调用init方法是在注册了initialize方法的application命名空间后,第二次是在run方法的路由监听时调用。我们可以通过debug_backtrace()方法打印找到这两个方法调用的位置。init方法首先定位模块所在目录,根据传入的$module参数进行查找。然后检查init.php文件是否在application目录下,如果在则直接加载;如果没有,检查runtime目录下是否有,然后加载init.php文件,如果没有,加载各种配置文件。例如应用目录下的common.php(通用文件)、provider.php(注册服务容器对象实例)、config.php(配置文件)、thinkphp目录下的helper.php(辅助函数文件)和中间件文件.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方法的执行方式BrainmapRoutingbrainmap