600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > thinkphp 框架自动加载原理_ThinkPHP5分析Part 1 基本框架流程

thinkphp 框架自动加载原理_ThinkPHP5分析Part 1 基本框架流程

时间:2023-11-12 16:36:19

相关推荐

thinkphp 框架自动加载原理_ThinkPHP5分析Part 1 基本框架流程

ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。

先放上一个图示 方便理解

然后放上目录结构

├─application 应用目录(可设置) │ ├─common 公共模块目录(可更改) │ ├─index 模块目录(可更改) │ │ ├─config.php模块配置文件 │ │ ├─common.php模块函数文件 │ │ ├─controller控制器目录 │ │ ├─model 模型目录 │ │ ├─view 视图目录 │ │ └─ ... 更多类库目录 │ ├─command.php 命令行工具配置文件 │ ├─common.php 应用公共(函数)文件 │ ├─config.php 应用(公共)配置文件 │ ├─database.php 数据库配置文件 │ ├─tags.php 应用行为扩展定义文件 │ └─route.php路由配置文件 ├─extend扩展类库目录(可定义) ├─publicWEB 部署目录(对外访问目录) │ ├─static 静态资源存放目录(css,js,image) │ ├─index.php应用入口文件 │ ├─router.php 快速测试文件 │ └─.htaccess用于 apache 的重写 ├─runtime应用的运行时目录(可写,可设置) ├─vendor第三方类库目录(Composer) ├─thinkphp 框架系统目录 │ ├─lang语言包目录 │ ├─library 框架核心类库目录 │ │ ├─think Think 类库包目录 │ │ └─traits系统 Traits 目录 │ ├─tpl系统模板目录 │ ├─.htaccess用于 apache 的重写 │ ├─.travis.yml CI 定义文件 │ ├─base.php 基础定义文件 │ ├─composer.jsoncomposer 定义文件 │ ├─console.php 控制台入口文件 │ ├─convention.php惯例配置文件 │ ├─helper.php 助手函数文件(可选) │ ├─LICENSE.txt 授权说明文件 │ ├─phpunit.xml 单元测试配置文件 │ ├─README.mdREADME 文件 │ └─start.php框架引导文件 ├─build.php 自动生成定义文件(参考) ├─composer.json composer 定义文件 ├─LICENSE.txt 授权说明文件 ├─README.md README 文件 ├─think 命令行入口文件

入口文件为public目录下的index.php 程序或许有一个或者多个入口文件,入口文件 一般首先会检测程序安装情况 定义一些环境变量,网站路径等,定义应用目录,最后一步为加载框架引导文件

首先进入start.php

一进去就加载了base.php

base.php里面做的事情可就多了

1.载入Loader类 thinkPHP5.0真正实现了按需加载,所有类库采用自动加载机制,并且支持类库映射和composer类库的自动加载。自动加载的实现由think\Loader类库完成,自动加载规范符合PHP的PSR-4

关于Loader类有一个比较重要的方法,这里强调一下

2.注册环境变量

3.注册自动加载 以及错误异常处理机制

4.最后一点着重说一下,Config的初始化 base.php最后一句话,初始化了Config,调用了config类的set方法

其实是加载了convention.php文件 它返回了一个数组

到这里base.php文件执行完毕,我们回到start.php中 App::run()->send(); 执行应用,这时候就可以跟进App类了,我们跟进run()方法。

run方法的默认参数是一个request对象 如果请求不为空 就处理这个请求 如果传入的参数为空 则先进入Request instance 初始化出一个请求对象。

然后调用自身的initcCommon initCommon又调用了init 最后返回Config::get()又一次初始化了config ,这里注意下,我们知道tp的每个模块,应用都有单独的配置文件,所以这里实现的就是除了加载总的配置文件,还要把应用单独的配置文件初始化。

接下来的流程我们看 源码的注释就可以了解大概了

接下来我们重点关注一个一个变量 $dispatch 它是关键的调度信息,用于路由到具体的模块方法,router主要处理后的url就存储在这个变量中。

这里先进行路由检测 如果没设置路由规则 就调用tp默认的访问方式 parseurl()返回解析出来的dispatch

解析出url,将目前的dispatch值赋值到request对象中,request对象获取到当前请求的调度信息

可以看到 requests类页游自己的dispatch变量 ???

然后看tp自己的注释就好,没什么可解释的了

然后,最终执行到核心了,注意下config和dispatch都传进来了

跟进去,整体是一个switch的逻辑,根据dispatch数组的type来选择进入哪段代码

先看放一张注释,解释的蛮清楚,着重说下 invokemethod,php的回调方法,还有var这个变量,这里已经注册了除路由参数外所有post get进来的变量了 主要是request中的参数 当然还有dispatch中参数

就算是先进入了module方法,也得再进入控制器方法处理

就算进入可控制器方法,最后还得调用具体的method

总结一下,exec就是执行了具体的分发了 最后返回data

执行完exec后 app的run()方法会返回一个response对象

我们再回到start.php 调用response的send方法,将输出返回到客户端

流程执行完毕

声明:本篇文章仅用于技术研究,严禁违法使用 ,否则后果自负。

关注我们解锁更多精彩内幕

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。