1.入口文件index.php(最主要是定义系统常量)
检测PHP环境
开关调试模式,常量形式
定义项目名,是为了将入口文件从项目应用目录下拿出来,放到同级的位置
定义项目根目录
定义项目应用目录
定义公共模块目录
定义运行时目录
定义自定义常量,也可以用业务逻辑静态类来管理自定义常量
引入THINKPHP入口文件
2.ThinkPHP.php
记录开始运行时间
记录内存初始使用
版本信息 URL 模式定义 类文件后缀 系统常量定义 [第一:const定义常量,初始化的时候值就是标量,代码一次性写好,就不会再变了;define定义常量,初始化的时候值可以是变量,变量可能依赖于初始化的环境.第二:const可以作为普通常量或者类常量来声明且不能使用在逻辑分支里,define可以在逻辑分支中使用.第三:const作为类常量时作用域限制在类中,define定义的常量在定义代码后是全局的而不用管在哪里定义]
PHP_SAPI = apache2handler || cgi || fcgi || cli
__DIR__当前调用代码文件所在物理目录
$_SERVER['SCRIPT_FILENAME'] 入口脚本物理路径
定义入口文件 _PHP_FILE_
定义入口文件所在根目录 __ROOT__
加载核心Think类 __ROOT__."ThinkPHP/Library/Think.class.php"
3.Think.class.php
命名空间 Think [命名空间是为了解决同名变量,常量,方法,类调用冲突的问题,最常用是解决自动加载类下产生的同名类问题,其实质类似于在调用的类中声明时使用飞雷神标记,在想找到被标记的类时,使用飞雷神追踪] 命名空间的调用方式 $obj = 命名空间名称\类名()
spl_autoload_register('Think\Think::autoload'); 注册自定义自动加载类[spl = Standard PHP LibraryPHP标准类库]
register_shutdown_function('Think\Think::fatalError'); 在脚本执行结束或者调用exit()之后 注册一个被执行的回调
set_error_handler('Think\Think::appError'); 注册自定义错误处理回调.本函数可以用你自己定义的方式来处理运行中的错误, 例如,在应用程序中严重错误发生时,或者在特定条件下触发了一个错误(使用 trigger_error()),你需要对数据/文件做清理回收
set_exception_handler('Think\Think::appException'); 设置默认的异常处理程序,用于没有用 try/catch 块来捕获的异常。 在 exception_handler 调用后异常会中止
Storage::connect(STORAGE_TYPE); 初始化文件存储方式
当debug模式关闭且运行时缓存文件$runtimefile = RUNTIME_PATH.APP_MODE.'~runtime.php'存在时,直接加载缓存;Storage::load($runtimefile);否则删除缓存;
判断 App/Common/Conf/core.php文件是否存在,来确定读取应用的模式.自己未定义的话则使用webroot/ThinkPHP/Mode/common.php文件,里面是一个数组配置,定义了配置文件,别名定义,函数和类文件,行为扩展定义配置;
读取应用模式配置中的函数文件和类文件,进行加载和编译
加载逻辑,首先在APP目录下的/Common/Conf/core.php文件是否存在[自定义配置],没有则使用ThinkPHP/Mode/common.php[框架本身的配置]
加载顺序:
框架函数库 ThinkPHP/Common/functions.php
C 获取和设置配置参数
load_config 加载配置文件
E 抛出异常
G 统计区间代码的运行时间和内存占用
L 获取和设置语言定义
trace 添加和获取页面Trace记录【】
compile 编译文件【】
T 获取模版文件 格式 资源://模块@主题/控制器/操作【】
I 获取输入参数 支持过滤和默认值
N 设置和获取统计数据
array_map_recursive 对数组成员递归使用函数处理
parse_name 字符串命名风格转换【C风格是将_加字母解析成大写字母,java风格是将大写字母解析为_加小写字母】
require_cache 自定义实现的require_once
file_exists_case 区分大小写的文件存在判断
import 导入所需的类库 同java的Import 本函数有缓存功能 内部包含了require_cache
load 基于命名空间方式导入函数库
vendor 快速导入第三方框架类库 所有第三方框架的类库文件统一放到 系统的Vendor目录下面
D 实例化模型类 格式 [资源://][模块/]模型
M 实例化一个没有模型文件的Model(Think\Model)
parse_res_name 解析资源地址并导入类库文件(资源地址 格式:[扩展://][模块/]资源名)
controller 用于实例化访问控制器
A 实例化多层控制器 格式:[资源://][模块/]控制器(自动缓存控制器对象)
R 远程调用控制器的操作方法 URL 参数格式 [资源://][模块/]控制器/操作(封装调用了A方法的逻辑)
tag 处理标签扩展(\Think\Hook::listen($tag,$params);)
B 执行某个行为(\Think\Hook::exec($name,$tag,$params);)
strip_whitespace 去除代码中的空白和注释
throw_exception 自定义异常处理(包含了Think\Log::record和Think\Think::halt)
dump 对输出流字符串格式做了一些处理
layout 设置当前页面的布局
U URL组装 支持不同URL模式.按照代码规则把输入参数解析成匹配模式的URL.如果要全局统一URL风格且会有切换的需求用这个,如果风格固定且知道,不如自己直接组装[]
W 内部调用R,指定了第三个参数而已
is_ssl 判断是否ssl协议
redirect 利用header函数重定向到URL地址
S 缓存管理
F 快速文件数据读取和保存 针对简单类型数据 字符串、数组
to_guid_string 根据PHP各种类型变量生成唯一标识号
xml_encode
session session管理
cookie cookie管理
load_ext_file 加载PHP类库,include
get_client_ip 获取客户端IP地址
send_http_status 发送HTTP状态,使用了header函数
think_filter 匹配到tp自定义关键字,在关键字后加上空格字符串
in_array_case 不区分
应用自定义函数库 App/Common/Common/function.php
ThinkPHP\Library/Think/Hook.class.php
钩子标签形式 array('类型1'=>array('行为1','行为2'), '类型2'=>array('行为1','行为2'));
覆盖导入钩子配置是覆盖类型,合并导入是同类型合并行为,不同类型增加行为
listen监听tag类型,实质是按钩子配置下tag的行为类实例化并执行tag方法,Behavior行为类默认调用run方法
ThinkPHP\Library/Think/App.class.php
监听应用初始化(Hook::listen('app_init');),埋点
执行应用初始化App::init()
加载动态应用公共文件和配置
设置日至目录为绝对路径
定义跟客户端请求相关的系统常量
URL调度Dispatcher::dispatch();完成URL解析、路由和调度
获取系统变量配置,主要是跟路由参数有关的配置,如模块,控制器,方法,以及兼容模式URL
是否适用子域名部署(默认否)
获取请求中的PATHINFO信息,分配到常量中
获取模块名称并校验合法性(是否存在模块目录,是否不在禁止访问模块列表里,先从模块参数m中获取,如果没有则为默认配置模块名Home)
定义当前模块路径,定义当前模块的模版缓存路径,定义当前模块的日志目录
模块检测Hook::listen('module_check');
检测并加载模块配置文件 模块/conf/config.php
检测并加载应用模式配置 模块/conf/config_应用模式名.php
检测并加载名模块别名配置 模块/conf/alias.php
检测并加载模块tags文件定义 模块/conf/tags.php
检测并加载模块函数库 模块/common/function.php
获取URL模式配置,并做判断
获取控制器的命名空间(路径)
获取控制器名,先从控制器参数c中获取,如果没有则为默认配置控制器名Index)
获取操作名,先从操作参数a中获取,如果没有则为默认配置操作名index)
URL调度结束标签Hook::listen('url_dispatch');
根据$_SERVER中的信息判断是否AJAX请求
监听应用开始(Hook::listen('app_begin');),埋点
非命令行模式下,启动session配置
记录应用初始化时间记录应用初始化时间(G('initTime');)
应用执行(App::exec();)
创建控制器实例(controller(CONTROLLER_NAME,CONTROLLER_PATH); )
通常控制器会use Think\Controller 并继承
监听应用结束(Hook::listen('app_end');)
ThinkPHP\Library/Think/Dispatcher.class.php
ThinkPHP\Library/Think/Route.class.php
ThinkPHP\Library/Think/Controller.class.php
ThinkPHP\Library/Think/View.class.php
ThinkPHP\Library/Behavior/BuildLiteBehavior.class.php
ThinkPHP\Library/Behavior/ParseTemplateBehavior.class.php
ThinkPHP\Library/Behavior/ContentReplaceBehavior.class.php
compile()???
加载系统惯例配置 ThinkPHP/Conf/convention.php
加载自定义配置 App/Common/Conf/config.php
同名参数自定义覆盖惯例
执行App::exec();
加载模式别名配置
加载自定义别名配置
同名参数自定义覆盖惯例
加载模式钩子配置
加载自定义钩子配置
加载框架底层语言包 \ThinkPHP/Lang/zh-cn.php
将框架中的数组配置,用var_export导出并统一写入到缓存runtime文件.主要包含了多语言,钩子和别名定义
读取当前应用状态对应的配置文件
设置系统时区(默认是PRC,中国时区)
检查应用目录结构 如果不存在则自动创建,默认模块是Home
记录加载文件时间
运行应用(App::run();)