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                扩展类库目录(可定义) ├─public                WEB 部署目录(对外访问目录) │  ├─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.json      composer 定义文件 │  ├─console.php        控制台入口文件 │  ├─convention.php     惯例配置文件 │  ├─helper.php         助手函数文件(可选) │  ├─LICENSE.txt        授权说明文件 │  ├─phpunit.xml        单元测试配置文件 │  ├─README.md          README 文件 │  └─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方法,将输出返回到客户端

流程执行完毕

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

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

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

  1. thinkphp 框架自动加载原理_thinkPHP5.0框架自动加载机制分析

    本文实例讲述了thinkPHP5.0框架自动加载机制.分享给大家供大家参考,具体如下: 概述 ThinkPHP5.0 真正实现了按需加载,所有类库采用自动加载机制,并且支持类库映射和composer类 ...

  2. thinkphp 框架自动加载原理_这下你应该理解ThinkPHP的Loader自动加载了

    想了很久终于要开始系列文章的编写了,期望是写出提升和面试都可以搞定的系列文章. 当你看到本文时,如果你发现咔咔没有编写到的面试热点问题或者技术难点,期待评论区指出,一起完善. 前言 目前再整理PHP进 ...

  3. PHP框架自动加载类文件原理

    描述:公司项目PHP用作中间转发层(接收http请求,用 socket跟c++做通信),由于代码没有用到框架,这些东西自然就是之前的人自己写的.最近需要对这个底层进行优化,于是便看了下这部分的代码. ...

  4. php自动加载原理,php中的自动加载类机制原理

    PHP最早讀取套件的方法 初學PHP時,最早會面對的問題之一就是require與include差別何在? require_once與include_once又是什麼? 弄懂這些問題之後,如果不使用fr ...

  5. thinkphp源码分析(三)—自动加载篇(Loader的分析)

    源码分析 自动加载 系统会调用 Loader::register()方法注册自动加载,在这一步完成后,所有符合规范的类库(包括Composer依赖加载的第三方类库)都将自动加载. 系统的自动加载由下面 ...

  6. python类加载机制_PHP面向对象自动加载机制原理与用法分析

    本文实例讲述了PHP面向对象自动加载机制原理与用法.分享给大家供大家参考,具体如下: 在学习PHP的面向对象的时候,会知道很多"语法糖",也就是魔术方法.有一个加自动加载的魔术方法 ...

  7. phpexcel的自动加载与其他框架有冲突

    2019独角兽企业重金招聘Python工程师标准>>> 一直想用phpEXCEL,这次这个项目遇到了.然而坑也出来了.phpexcel的Autoloader.php里面 public ...

  8. php ajax 上拉显示更多,PHP+Ajax点击加载更多内容 -这个效果好,速度快,只能点击更多加载,不能滚动自动加载...

    这个效果好,速度快,只能点击更多加载,不能滚动自动加载 一.HTML部分 ::点击加载更多内容:: 引入jQuery插件和jquery.more.js加载更多插件 jQuery $(function( ...

  9. php cli spl_autoload_register,PHP spl_autoload_register 自动加载方法浅析

    本节内容: PHP spl_autoload_register 自动加载 说明: spl_autoload_register()函数是主流框架使用最多的函数,也是非常核心的函数之一,可实现自动注册函数 ...

最新文章

  1. pthread_create()之前的属性设置
  2. 【转载】10个最“优秀”的代码注释
  3. Hadoop2.0新特性
  4. DC-DC电源PCB设计指南
  5. wordpress中文教程
  6. Codeforces 402 and 403 (Div. 2 and 1)
  7. 如何用Python打造你的第一个Slack Bot
  8. 计算机班英语试卷考法,计算机专业英语期末考试试卷A
  9. 局域网限速软件_8款Windows实用软件推荐,纯干货,总有一款是你必备的
  10. Element 表格序号问题
  11. linux mint如何安装输入法(以google输入法为例)
  12. 当物流行业遇见MongoDB
  13. gbd的简单使用(一)
  14. 一元享移动怎么样_移动新套餐:18元享“全免流”+1元1G流量,阿里鱼卡要遭殃?...
  15. wps删除分节符导致前面格式变乱的解决方案
  16. 2020秋季校园招聘深信服、噢易云、绿盟面筋
  17. 编译器错误 C2355
  18. mysql不可重复读和重复读_MySql隔离级别:RU / RC / RR / S + 脏读 / 不可重复读 / 幻读 / 可重复读...
  19. UVa514 铁轨 C++
  20. 今天突然看到一篇介绍WIN98的文章,才发现原来真的老了

热门文章

  1. CRNN维度变换的解释这样你也可以自定义CRNN了
  2. 使用分布式+you-get多任务下载视频
  3. BZOJ2498 : Xavier is Learning to Count
  4. Ubuntu系统(七)-安装FTP
  5. 无聊中安装的MAC OS截图欣赏
  6. springboot+vue在线音乐网站
  7. csharp DataTable and DataGridView delete a Row
  8. 用 gdb 调试 GCC 程序
  9. Java程序中的死锁
  10. Spring消息之WebSocket