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框架运行原理的更多相关文章

  1. Asp.net WebPages框架运行原理浅析(转)

    在Asp.net4和4.5中,新增了WebPages Framework,编写页面代码使用了新的Razor语法,代码更加的简洁和符合Web标准,编写方式更接近于PHP和以前的Asp,和使用 WebFo ...

  2. Asp.net WebPages框架运行原理浅析

    [来源] 达内    [编辑] 达内   [时间]2012-09-14 在Asp.net4和4.5中,新增了WebPages Framework,编写页面代码使用了新的Razor语法,代码更加的简洁和 ...

  3. net框架运行原理

    核心是CLR(通用语言运行时), c#或者其它各种语言编译原理:将原代码通过相对的编译器(语法检查原代码分析)生成IL代码托管(IL也称托管代码),最后得到一个托管模块,一个或多个托管模块组成程序集( ...

  4. Springmvc的运行原理 SpringMvc的优点

    SpringMVC框架运行原理 1:客户端发送请求到前端控制器(DispatcherServlet),前端控制器根据请求信息(url),查询一个或多个HandlerMapping, 前端控制器,来决定 ...

  5. 测试框架Unitest的运行原理,以及多个测试类中的执行顺序以及简化方法

    单元测试单元测试(unit testing)是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一 ...

  6. Web自动化必会知识:「Web基础、元素定位、元素操作、Selenium运行原理、项目实战+框架」

    1.web 基础-html.dom 对象.js 基本语法 Dom 对象里面涉及元素定位以及对元素的修改.因为对元素操作当中涉及的一些 js 操作,js 基本语法要会用.得要掌握前端的基本用法.为什么要 ...

  7. 互联网轻量级框架SSM-查缺补漏第七天(MyBatis的解析和运行原理)

    第七章MyBatis的解析和运行原理 SqlSessionFactory是MyBatis的核心类之一,其最重要的功能就是提供创建MyBatis的核心借口SqlSession,所以要先创建SqlSess ...

  8. PHP框架模板原理

           PHP框架现在是一种很流行的东西了,很多朋友开发应用与网站都会选择一个PHP框架或模板了,下面我们来看看PHP框架是如何实现的吧. 本文主要来聊聊框架理论,但不针对任何一款框架,不过任何 ...

  9. ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)

    ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件) Startup Class 1.Startup Constructor(构造函数) 2.Configure ...

随机推荐

  1. 3、pytorch实现最基础的MLP网络

    %matplotlib inline import numpy as np import torch from torch import nn import matplotlib.pyplot as ...

  2. AcWing 404. 婚礼

    大型补档计划 题目链接 根据题意,显然只有新郎这边可能存在矛盾,考虑这边怎么放即可,新娘那边的放法与这边正好相反且一一对应. 显然对于两个约束条件是一对矛盾,开始我以为可以用并查集,后来发现输出方案的 ...

  3. Java为什么称为动态编译?

    Java在程序运行时产生Java类并编译成.class文件.

  4. Day1 input&print

    1.print函数 格式: 打印字符串:print('xxx','yyy') 可以接受多个字符串,多个字符串之间使用逗号分隔. 间隔字符串的逗号会被打印成空格输出. 打印整数或计算结果:print(' ...

  5. react第七单元(组件的高级用法-组件的组合(children的用法)-高阶组件-封装组件)

    第七单元(组件的高级用法-组件的组合(children的用法)-高阶组件-封装组件) #受控组件 简而言之,就是受到状态state控制的表单,表单的值改变则state值也改变,受控组件必须要搭配onc ...

  6. Spark内核-部署模式

    Master URL Meaning local 在本地运行,只有一个工作进程,无并行计算能力. local[K] 在本地运行,有K个工作进程,通常设置K为机器的CPU核心数量. local[*] 在 ...

  7. $$ PHP 的含义

    php中两个$也就bai是$$用来定义可变变量. 所谓可变变量,就是一个变量的名,又是一个变量.

  8. Open_basedir绕过

    Open_basedir绕过 一.基础知识 open_basedir是php.ini中的一个配置选项,它可将用户访问文件的活动范围限制在指定的区域, 假设open_basedir=/home/wwwr ...

  9. 带你探究Python的诞生和由来

    最近,Python语言越来越火,那什么是Python?它怎么诞生的?它跟C语言.shell语言有什么区别?语言环境是怎么样的?下面,跟着我的步伐,一起去了解一下吧~ Python 诞生在一个圣诞节 P ...

  10. Dubbo服务调用过程源码解析④

    目录 0.服务的调用 1.发送请求 2.请求编码 3.请求的解码 4.调用具体服务 5.返回调用结果 6.接收调用结果 Dubbo SPI源码解析① Dubbo服务暴露源码解析② Dubbo服务引用源 ...