目前国内比较流行的php框架由thinkphp,yii,Zend Framework,CodeIgniter等。一直觉得自己在php方面还是一个小学生,只会用别人的框架,自己也没有写过,当然不是自己不想写,而是感觉自己的实力不够,哈哈。。那么如何使得自己的编码能力变得强悍呢,那当然是去看别人写的优秀的代码了。所以今天终于准备自己写一个源码分析系列,目的很简单,就是希望自己能够在php方面能够更上一层楼。

关于为什么选择thinkphp,原因主要有以下几点:第一,周围的同学和公司用的几乎都是thinkphp,可能也和身处二线城市有关,互联网发展还不是很好。第二,thinkphp最近几年也确实发展很快,社区也非常活跃,产品也逐渐成熟,使用者渐多。第三,中文文档非常丰富,我觉得用它来入门确实不错啦。

先写个计划目录吧。

前期先从宏观上了解thinkphp,了解其主要结构。然后根据thinkphp的代码执行流程去分析,在流程分析的同时兼顾一些重要函数的解析。在流程分析完毕后,就已经对thinkphp有了一个全新的认识了。然后再去分析其细节,主要是其主要的类库,包括数据库类,控制器类,视图类,URL重写,行为扩展,SQL注入等等。一般的思路是跟着thinphp的官方手册走。在了解怎么使用的同时,也要了解为什么这么使用。这才是源码分析的重点。

计划是3天一篇,也希望我能坚持下来吧!阿门!!!

贴一下官方手册上的执行流程图:

系统流程:

    用户URL请求调用应用入口文件(通常是网站的index.php)载入框架入口文件(ThinkPHP.php)记录初始运行时间和内存开销系统常量判断及定义载入框架引导类(Think\Think)并执行Think::start方法进行应用初始化设置错误处理机制和自动加载机制调用Think\Storage类进行存储初始化(由STORAGE_TYPE常量定义存储类型)部署模式下如果存在应用编译缓存文件则直接加载(直接跳转到步骤22)读取应用模式(由APP_MODE常量定义)的定义文件(以下以普通模式为例说明)加载当前应用模式定义的核心文件(普通模式是 ThinkPHP/Mode/common.php)加载惯例配置文件(普通模式是 ThinkPHP/Conf/convention.php)加载应用配置文件(普通模式是 Application/Common/Conf/config.php)加载系统别名定义判断并读取应用别名定义文件(普通模式是 Application/Common/Conf/alias.php)加载系统行为定义判断并读取应用行为定义文件(普通模式是 Application/Common/Conf/tags.php)加载框架底层语言包(普通模式是 ThinkPHP/Lang/zh-cn.php)如果是部署模式则生成应用编译缓存文件加载调试模式系统配置文件(ThinkPHP/Conf/debug.php)判断并读取应用的调试配置文件(默认是 Application/Common/Conf/debug.php)判断应用状态并读取状态配置文件(如果APP_STATUS常量定义不为空的话)检测应用目录结构并自动生成(如果CHECK_APP_DIR配置开启并且RUNTIME_PATH目录不存在的情况下)调用Think\App类的run方法启动应用应用初始化(app_init)标签位侦听并执行绑定行为判断并加载动态配置和函数文件调用Think\Dispatcher::dispatch方法进行URL请求调度自动识别兼容URL模式和命令行模式下面的$_SERVER['PATH_INFO']参数检测域名部署以及完成模块和控制器的绑定操作(APP_SUB_DOMAIN_DEPLOY参数开启)分析URL地址中的PATH_INFO信息获取请求的模块信息检测模块是否存在和允许访问判断并加载模块配置文件、别名定义、行为定义及函数文件判断并加载模块的动态配置和函数文件模块的URL模式判断模块的路由检测(URL_ROUTER_ON开启)PATH_INFO处理(path_info)标签位侦听并执行绑定行为URL后缀检测(URL_DENY_SUFFIX以及URL_HTML_SUFFIX处理)获取当前控制器和操作,以及URL其他参数URL请求调度完成(url_dispatch)标签位侦听并执行绑定行为应用开始(app_begin)标签位侦听并执行绑定行为调用SESSION_OPTIONS配置参数进行Session初始化(如果不是命令行模式)根据请求执行控制器方法如果控制器不存在则检测空控制器是否存在控制器开始(action_begin)标签位侦听并执行绑定行为默认调用系统的ReadHtmlCache行为读取静态缓存(HTML_CACHE_ON参数开启)判断并调用控制器的_initialize初始化方法判断操作方法是否存在,如果不存在则检测是否定义空操作方法判断前置操作方法是否定义,有的话执行Action参数绑定检测,自动匹配操作方法的参数如果有模版渲染(调用控制器display方法)视图开始(view_begin)标签位侦听并执行绑定行为调用Think\View的fetch方法解析并获取模版内容自动识别当前主题以及定位模版文件视图解析(view_parse)标签位侦听并执行绑定行为默认调用内置ParseTemplate行为解析模版(普通模式下面)模版引擎解析模版内容后生成模版缓存模版过滤替换(template_filter)标签位侦听并执行绑定行为默认调用系统的ContentReplace行为进行模版替换输出内容过滤(view_filter)标签位侦听并执行绑定行为默认调用系统的WriteHtmlCache行为写入静态缓存(HTML_CACHE_ON参数开启)调用Think\View类的render方法输出渲染内容视图结束(view_end)标签位侦听并执行绑定行为判断后置操作方法是否定义,有的话执行控制器结束(action_end)标签位侦听并执行绑定行为应用结束(app_end)标签位侦听并执行绑定行为执行系统的ShowPageTrace行为(SHOW_PAGE_TRACE参数开启并且不是AJAX请求)日志信息存储写入

转载于:https://www.cnblogs.com/ronghua/p/6000507.html

Thinkphp源码分析系列–开篇相关推荐

  1. Spring IOC 容器源码分析系列文章导读 1

    1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本.经过十几年的迭代,现在的 Spring 框架已经非常成熟了.Spring ...

  2. Thinkphp 源码分析

    Thinkphp 源码分析 ThinkPHP是国内非常火的一个轻量级框架,采用MVC模式,结构写的非常好,今天 大象 带大家走一下ThinkPHP框架系统运行流程,我将跟随ThinkPHP的执行进行代 ...

  3. jQuery源码分析系列

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...

  4. MyBatis 源码分析系列文章合集

    1.简介 我从七月份开始阅读MyBatis源码,并在随后的40天内陆续更新了7篇文章.起初,我只是打算通过博客的形式进行分享.但在写作的过程中,发现要分析的代码太多,以至于文章篇幅特别大.在这7篇文章 ...

  5. MyBatis 源码分析系列文章导读

    1.本文速览 本篇文章是我为接下来的 MyBatis 源码分析系列文章写的一个导读文章.本篇文章从 MyBatis 是什么(what),为什么要使用(why),以及如何使用(how)等三个角度进行了说 ...

  6. Spring IOC 容器源码分析系列文章导读

    1. 简介 前一段时间,我学习了 Spring IOC 容器方面的源码,并写了数篇文章对此进行讲解.在写完 Spring IOC 容器源码分析系列文章中的最后一篇后,没敢懈怠,趁热打铁,花了3天时间阅 ...

  7. dubbo源码分析系列(1)扩展机制的实现

    1 系列目录 dubbo源码分析系列(1)扩展机制的实现 dubbo源码分析系列(2)服务的发布 dubbo源码分析系列(3)服务的引用 dubbo源码分析系列(4)dubbo通信设计 2 SPI扩展 ...

  8. idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(一)

    课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...

  9. [转]jQuery源码分析系列

    文章转自:jQuery源码分析系列-Aaron 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAaro ...

最新文章

  1. 微软职位内部推荐-Sr. Dev Lead
  2. EducationalCodeforcesRound62(Div. 2)(A-D题解)
  3. Pycharm新建文件时自动添加基础信息
  4. mysql查看session对应的ip_Mysql 查看session连接数,状态 | 学步园
  5. Chrome控制台中network底部概要参数
  6. Java通过Mybatis实现批量插入数据到Oracle中
  7. LeetCode题库5:最长回文子串——JavaScript解答
  8. sqlserver2008未将对象引用设置到对象的实例_JVM | Java对象的创建、存储和访问详解...
  9. 微信小程序开发学习笔记007--微信小程序项目01
  10. [LeetCode]小工具,统计数量,隐藏上锁的题目
  11. 第十一篇 面向对象进阶
  12. php8拦截器,Web中的监听器 过滤器 拦截器
  13. python怎么添加ui_大神可以帮我看看怎么把这个python代码利用ui运行呢
  14. creo绘图属性模板_CREO工程图模板创建
  15. Rotator和Vector之间的转换
  16. Java封装和多态作业
  17. 连接Wifi显示“无internet,安全”的七种解决方法
  18. 计算机的喇叭接口显示的英文,电脑上喇叭图标不见了怎么找到(电脑不显示扬声器图标的解决方法)...
  19. 15个Python入门小程序,同事准时下班“小技巧”被我发现了
  20. 企业如何选择物联网卡以及流量套餐?

热门文章

  1. 移动硬盘无法安全弹出解决方法
  2. 如何将浏览器设置为海外当地浏览器?
  3. 对接快递100快递管家API之物流信息推送接口
  4. 虚拟机web服务器配置ppt,在Linux虚拟机下配置apache构建web服务器.doc
  5. 丰田的精益生产 [转]
  6. range form /recover from等动词词组
  7. Tomcat配置路径
  8. 适合看剧的投影仪推荐,居家追剧当选当贝D3X!
  9. 利用前三年的数据预测2018年NBA常规赛东西部前八的详细过程和解决思路(19年类似)
  10. 很好用的查看音频波形的软件cool edit pro