thinkphp3.2框架运行原理
thinkphp3.2是使用率非常普遍的国产php框架,以简单易于上手闻名,那么它框架结构是怎样的?
tp3.2设计简单来说就是CBD,core(框架核心文件),bebavior(行为,tp3.2一大特点就是钩子众多),driver(各种驱动,根据项目需要),针对这三大方面从源码来看框架的运行的原理。
因为tp3.2的古老,所以入口文件没有像5.0和其它主流框架那样做动静分离,index.php直接放在根目录下,打开index.php,里面有引入框架核心文件从而进入框架:

然后打开框架核心文件:

首先看到的是定义的一堆系统常量,包括规定了类名后缀必须是.class.php结尾,最后引入并且运行了框架应用,从这里框架逻辑正式开始。

接着,打开核心Think核心类,首先异常捕捉处理,
// 注册AUTOLOAD方法
spl_autoload_register('Think\Think::autoload');
// 设定错误和异常处理
register_shutdown_function('Think\Think::fatalError');
set_error_handler('Think\Think::appError');
set_exception_handler('Think\Think::appException');
register_shutdown_function,set_error_handler,set_exception_handler三段式,基本每个框架都会有。
接着是加载缓存文件
$runtimefile = RUNTIME_PATH.APP_MODE.'~runtime.php';,
tp里文件运行先以缓存临时文件为主。
接着是最关键的一步,引入框架核心文件
$mode = include is_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php';

这里引入叫commom.php的文件,这里面是预先定义的一些需要框架加载时就引入的文件,驱动,行为,甚至核心文件都有。
不过在tp5和tp5.1这些核心文件都实现了依赖注册函数的惰性加载,性能有所提升。

然后是注册函数加载不需要初始化的文件,比如model,controller,部分驱动,这些文件可以在实例化的加载。
然后运行应用:
// 运行应用
App::run();
接着,打开应用程序类, 查看执行应用过程管理,
首先是对http请求方式进行处理,过滤
define('NOW_TIME', $_SERVER['REQUEST_TIME']);
define('REQUEST_METHOD',$_SERVER['REQUEST_METHOD']);
define('IS_GET', REQUEST_METHOD =='GET' ? true : false);
define('IS_POST', REQUEST_METHOD =='POST' ? true : false);
define('IS_PUT', REQUEST_METHOD =='PUT' ? true : false);
define('IS_DELETE', REQUEST_METHOD =='DELETE' ? true : false);
// URL调度
Dispatcher::dispatch();
if(C('REQUEST_VARS_FILTER')){
// 全局安全过滤
array_walk_recursive($_GET, 'think_filter');
array_walk_recursive($_POST, 'think_filter');
array_walk_recursive($_REQUEST, 'think_filter');
}
然后根据请求的路由规则,调用相应的控制器,控制器作为请求的入口,几乎所有框架都这样,tp也不例外。
$module = controller(CONTROLLER_NAME,CONTROLLER_PATH);
这里根据提交请求的参数名称实例化相应的控制器,然后调用相应的方法
$action = ACTION_NAME.C('ACTION_SUFFIX');
不过这里做了一个参数传递校验和过滤,个人觉得不是一个好的设计,导致不能在控制器里直接使用形参,会让开发变得麻烦,例如为了避免动态方法调用的繁琐,通常可以直接注入(Request $request)

通过反射的放射,处理控制器的参数,限制了只有传参,并且可以自动将http参数赋值给控制器形参,不过这种设计在tp5中被废除。
进入控制器后就可以进行逻辑代码编写了,值得一提的是,tp3.2模板引入还是依赖直接输出,中断下面代码执行的display,到了tp5则和yii2,lavarel一样改为return,将控制器方法作为一个中间处理过程,最终输出到浏览器还要进行统一灵活的数据处理。
链接:https://www.jianshu.com/p/e48c17bff7e4
thinkphp3.2框架运行原理的更多相关文章
- Asp.net WebPages框架运行原理浅析(转)
在Asp.net4和4.5中,新增了WebPages Framework,编写页面代码使用了新的Razor语法,代码更加的简洁和符合Web标准,编写方式更接近于PHP和以前的Asp,和使用 WebFo ...
- Asp.net WebPages框架运行原理浅析
[来源] 达内 [编辑] 达内 [时间]2012-09-14 在Asp.net4和4.5中,新增了WebPages Framework,编写页面代码使用了新的Razor语法,代码更加的简洁和 ...
- net框架运行原理
核心是CLR(通用语言运行时), c#或者其它各种语言编译原理:将原代码通过相对的编译器(语法检查原代码分析)生成IL代码托管(IL也称托管代码),最后得到一个托管模块,一个或多个托管模块组成程序集( ...
- Springmvc的运行原理 SpringMvc的优点
SpringMVC框架运行原理 1:客户端发送请求到前端控制器(DispatcherServlet),前端控制器根据请求信息(url),查询一个或多个HandlerMapping, 前端控制器,来决定 ...
- 测试框架Unitest的运行原理,以及多个测试类中的执行顺序以及简化方法
单元测试单元测试(unit testing)是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一 ...
- Web自动化必会知识:「Web基础、元素定位、元素操作、Selenium运行原理、项目实战+框架」
1.web 基础-html.dom 对象.js 基本语法 Dom 对象里面涉及元素定位以及对元素的修改.因为对元素操作当中涉及的一些 js 操作,js 基本语法要会用.得要掌握前端的基本用法.为什么要 ...
- 互联网轻量级框架SSM-查缺补漏第七天(MyBatis的解析和运行原理)
第七章MyBatis的解析和运行原理 SqlSessionFactory是MyBatis的核心类之一,其最重要的功能就是提供创建MyBatis的核心借口SqlSession,所以要先创建SqlSess ...
- PHP框架模板原理
PHP框架现在是一种很流行的东西了,很多朋友开发应用与网站都会选择一个PHP框架或模板了,下面我们来看看PHP框架是如何实现的吧. 本文主要来聊聊框架理论,但不针对任何一款框架,不过任何 ...
- ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)
ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件) Startup Class 1.Startup Constructor(构造函数) 2.Configure ...
随机推荐
- Spring RestTemplate具备负载均衡功能
在创建RestTemplate的Bean时使用@LoadBalanced注解, 就可以自动配置为使用ribbon.如下面的示例所示: @Configuration public class MyCo ...
- 权威部门接连下发文件,Panda交易所带你走进区块链概念股
Panda交易所获悉,7月21日,北京市地方金融监督管理局发文<北京股权交易中心获得首批开展区块链试点建设资格>,文中表示证监会7月7日发布<关于原则同意北京.上海.苏州.浙江.深圳 ...
- 阿里云服务器搭建java环境(jdk+tomcat+oracle11g)
一.JDK配置 1.在centos 7的更新源中有JDK,使用yum即可下载安装 查看库中版本 [root@localhost ~]# yum search java|grep jdk 选择需要版本进 ...
- 侧边栏js样式代码
<!-- menu html --> <div class="container"> <div class="menu-wrap optis ...
- 常见的 emit 实现 AOP demo
0. 前言 上接:思想无语言边界:以 cglib 介绍 AOP 在 java 的一个实现方式 作为第四篇,我们回顾一下 csharp 里面比较常见动态编织实现方式emit 内容安排如下: emit a ...
- 系统类 System类
System类代表系统,系统级的很多属性和控制方法都放置在该类的内部.该类位于java.lang包. 由于该类的构造方法是private的,所以无法创建该类的对象,也就是无法实例化该类.其内部的成员变 ...
- [日常摸鱼]bzoj1218[HNOI2003]激光炸弹-二维前缀
题意:二维网格一些格子有权值,求用边长为$r$的正方形能覆盖到格子权值和的最大值,格子大小$ \leq 5000$ 非常裸的二维前缀,然而 题目下标从0开始! QAQ 要是比赛就要爆零啦- #incl ...
- [日常摸鱼]HDU3007Buried memory-最小圆覆盖
最小圆覆盖裸题 我求外接圆的方法比较奇怪-不过还是过掉了 #include<cstdio> #include<cmath> #include<cstdlib> #i ...
- Pygame的简单总结
Pygame learn from mooc 私货:在调用函数时,可以 1.import tkinter (不过在使用时还要加前缀如tkinter.Tk()) 2.import tkinter as ...
- Fresco 二三事:图片处理之旋转、缩放、裁剪切割图片
关于Fresco加载图片的处理,例如旋转.裁剪切割图片,在官方文档也都有提到,只是感觉写的不太详细,正好最近项目里有类似需求,所以分享一些使用小tip,后面的朋友就不用再走弯路浪费时间了.(测试图片分 ...