首先:入口文件
// 检测PHP环境
if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !');
// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define('APP_DEBUG',True);
// 定义应用目录
define('APP_PATH','./Application/');
// 引入ThinkPHP入口文件
require './ThinkPHP/ThinkPHP.php';
// 亲^_^ 后面不需要任何代码了 就是如此简单
以上代码,看过tp的人应该是非常熟悉的,这段代码直接进入系统目录(ThinkPHP/)下的ThinkPHP.php中
ThinkPHP.php文件里面主要做了一些常量的定义,你可以先不了太过仔细看每个常量是什么意思,因为看了,过一会也会忘记的。你只要记住,这个文件定义了系统的大多数的常量就好了,把更多的精力放在后面的类的解读中。
ThinkPHP.php定义完相关的常量以后,会加载核心Think类
//......
// 加载核心Think类
require CORE_PATH.'Think'.EXT;
// 应用初始化
Think\Think::start();
看到这里,我们就打开Think.class.php文件
文件主要讲的是大致流程,一些无关流程的方法就不介绍了
所以Think.class.php文件,主要熟悉+精通 start()方法
/**
* 应用程序初始化
* @access public
* @return void
*/
static public function start() {
// 注册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');
// 初始化文件存储方式
Storage::connect(STORAGE_TYPE);
$runtimefile = RUNTIME_PATH.APP_MODE.'~runtime.php';
//APP_DEBUG为调试模式配置,APP_DEBUG = TRUE的时候是开启调试模式的
if(!APP_DEBUG && Storage::has($runtimefile)){
//如果没有开启调试模式并且缓存文件存在,系统并会加载缓存文件
Storage::load($runtimefile);
}else{
if(Storage::has($runtimefile))
Storage::unlink($runtimefile);
$content = '';
// 读取应用模式,如果应用下面自定了core.php文件,直接加载之;否则读取系统目录下的Mode文件夹下的模式应用文件
$mode = include is_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php';
// 加载核心文件
foreach ($mode['core'] as $file){
if(is_file($file)) {
include $file;
if(!APP_DEBUG) $content .= compile($file);
}
}
// 加载应用模式配置文件
foreach ($mode['config'] as $key=>$file){
is_numeric($key)?C(load_config($file)):C($key,load_config($file));
}
// 读取当前应用模式对应的配置文件
if('common' != APP_MODE && is_file(CONF_PATH.'config_'.APP_MODE.CONF_EXT))
C(load_config(CONF_PATH.'config_'.APP_MODE.CONF_EXT));
// 加载模式别名定义
if(isset($mode['alias'])){
self::addMap(is_array($mode['alias'])?$mode['alias']:include $mode['alias']);
}
// 加载应用别名定义文件
if(is_file(CONF_PATH.'alias.php'))
self::addMap(include CONF_PATH.'alias.php');
// 加载模式行为定义
if(isset($mode['tags'])) {
Hook::import(is_array($mode['tags'])?$mode['tags']:include $mode['tags']);
}
// 加载应用行为定义
if(is_file(CONF_PATH.'tags.php'))
// 允许应用增加开发模式配置定义
Hook::import(include CONF_PATH.'tags.php');
// 加载框架底层语言包
L(include THINK_PATH.'Lang/'.strtolower(C('DEFAULT_LANG')).'.php');
if(!APP_DEBUG){
$content .= "\nnamespace { Think\Think::addMap(".var_export(self::$_map,true).");";
$content .= "\nL(".var_export(L(),true).");\nC(".var_export(C(),true).');Think\Hook::import('.var_export(Hook::get(),true).');}';
Storage::put($runtimefile,strip_whitespace('<?php '.$content));
}else{
// 调试模式加载系统默认的配置文件
C(include THINK_PATH.'Conf/debug.php');
// 读取应用调试配置文件
if(is_file(CONF_PATH.'debug'.CONF_EXT))
C(include CONF_PATH.'debug'.CONF_EXT);
}
}
// 读取当前应用状态对应的配置文件
if(APP_STATUS && is_file(CONF_PATH.APP_STATUS.CONF_EXT))
C(include CONF_PATH.APP_STATUS.CONF_EXT);
// 设置系统时区
date_default_timezone_set(C('DEFAULT_TIMEZONE'));
// 检查应用目录结构 如果不存在则自动创建
if(C('CHECK_APP_DIR')) {
$module = defined('BIND_MODULE') ? BIND_MODULE : C('DEFAULT_MODULE');
if(!is_dir(APP_PATH.$module) || !is_dir(LOG_PATH)){
// 检测应用目录结构
Build::checkDir($module);
}
}
// 记录加载文件时间
G('loadTime');
<pre name="code" class="php"> // 运行应用
App::run();
}
这个方法主要做的是:
自动加载
异常,错误处理方法
核心文件加载
语言包加载
别名加载
配置文件加载
行为加载
...
程序走到这里,应用程序准备阶段告一段落,最后调用
// 运行应用
App::run();
应用准备工作完毕,自然是运行这个应用,程序进入
App.class.php 这个类文件主要围绕一个方法进行:App::run();
/**
* 运行应用实例 入口文件使用的快捷方法
* @access public
* @return void
*/
static public function run() {
App::init();
// Session初始化
if(!IS_CLI){
session(C('SESSION_OPTIONS'));
}
// 记录应用初始化时间
G('initTime');
App::exec();
return ;
}
这个方法调用
App::init();
在App::init()主要是对URL的解析和请求常量的定义
最后调用App::exec()方法,程序走到这里,就差不多走完了
App::exec()方法调用控制器(Controller)的方法,调用方法用到了类反射,最后就是控制器调用视图显示页面。
毕~
差不多了,学习总结,如有错误,请留言告知,笔者将不胜感激