2.ThinkPHP执行流程
1.新建index.php
调用ThinkPHP.php文件
include "../../ThinkPHP/ThinkPHP.php";
2.读ThinkPHP.php文件
if(defined('ENGINE_NAME')) { }else{ //没有定义ENGINE_NAME,直接else if(!APP_DEBUG && is_file(RUNTIME_FILE)) { // APP_DEBUG默认定义为false,默认执行开发模式 }else{ //修改APP_DEBUG为true,载入调试模式 require THINK_PATH.'Common/runtime.php'; //加载runtime.php文件 } }
在index.php文件中修改APP_DEBUG
define("APP_DEBUG", true);
3.读runtime.php文件
defined('THINK_PATH') or exit(); //没有THINK_PHP直接退出,必须从入口文件走 if(version_compare(PHP_VERSION,'5.2.0','<')); //要求PHP版本大于5.2.0
Phpinfo(); //查看自己PHP版本
if(version_compare(PHP_VERSION,'5.4.0','<')) { //判断PHP版本是否小于5.4.0 ini_set('magic_quotes_runtime',0); define('MAGIC_QUOTES_GPC',get_magic_quotes_gpc()?True:False); //在get等中加转义符号 }else{ }
define('IS_CGI',substr(PHP_SAPI, 0,3)=='cgi' ? 1 : 0 ); define('IS_WIN',strstr(PHP_OS, 'WIN') ? 1 : 0 ); //是否是window系统 1 define('IS_CLI',PHP_SAPI=='cli'? 1 : 0); //是否是命令行模式 0
声明许多常量信息
// 路径设置 可在入口文件中重新定义 所有路径常量都必须以/ 结尾 defined('CORE_PATH') or define('CORE_PATH', THINK_PATH.'Lib/'); // 系统核心类库目录 defined('EXTEND_PATH') or define('EXTEND_PATH', THINK_PATH.'Extend/'); // 系统扩展目录 defined('MODE_PATH') or define('MODE_PATH', EXTEND_PATH.'Mode/'); // 模式扩展目录 defined('ENGINE_PATH') or define('ENGINE_PATH', EXTEND_PATH.'Engine/'); // 引擎扩展目录 defined('VENDOR_PATH') or define('VENDOR_PATH', EXTEND_PATH.'Vendor/'); // 第三方类库目录 defined('LIBRARY_PATH') or define('LIBRARY_PATH', EXTEND_PATH.'Library/'); // 扩展类库目录 defined('COMMON_PATH') or define('COMMON_PATH', APP_PATH.'Common/'); // 项目公共目录 defined('LIB_PATH') or define('LIB_PATH', APP_PATH.'Lib/'); // 项目类库目录 defined('CONF_PATH') or define('CONF_PATH', APP_PATH.'Conf/'); // 项目配置目录 defined('LANG_PATH') or define('LANG_PATH', APP_PATH.'Lang/'); // 项目语言包目录 defined('TMPL_PATH') or define('TMPL_PATH', APP_PATH.'Tpl/'); // 项目模板目录 defined('HTML_PATH') or define('HTML_PATH', APP_PATH.'Html/'); // 项目静态目录 defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH.'Logs/'); // 项目日志目录 defined('TEMP_PATH') or define('TEMP_PATH', RUNTIME_PATH.'Temp/'); // 项目缓存目录 defined('DATA_PATH') or define('DATA_PATH', RUNTIME_PATH.'Data/'); // 项目数据目录 defined('CACHE_PATH') or define('CACHE_PATH', RUNTIME_PATH.'Cache/'); // 项目模板缓存目录
加载系统核心类文件
load_runtime_file() { require THINK_PATH.'Common/common.php'; //加载函数库文件ThinkPHP/Common };
自动创建应用目录
// 检查项目目录结构 如果不存在则自动创建 if(!is_dir(LIB_PATH)) { // 创建项目目录结构,默认没有,自动创建 build_app_dir(); }elseif(!is_dir(CACHE_PATH)){ // 检查缓存目录 check_runtime(); }elseif(APP_DEBUG){ // 调试模式切换删除编译缓存 if(is_file(RUNTIME_FILE)) unlink(RUNTIME_FILE); }
Think::start(); //类文件调用自己的静态方法
4.这个类文件就是ThinkPHP/Lib/Core/Think.class.php
static function start() {
Think::buildApp(); //ThinkPHP/Lib/Core/Think.class.php下的buildApp()
App::run(); //ThinkPHP/Lib/Core/App.class.php下的run() }
4.1.先运行buildApp()
Think::buildApp( //先加载ThinkPHP/Conf/ convention.php C(include THINK_PATH.'Conf/convention.php'); //再加载Shop/Conf/config.php if(is_file(CONF_PATH.'config.php')) )
ThinkPHP/Conf/convention.php
自己的项目/Conf/config.php,用户自己修改在config中配置各种参数。config.php文件覆盖convention.php文件,先加载convention.php再加载config.php。
再加载底层语言包
L(include THINK_PATH.'Lang/'.strtolower(C('DEFAULT_LANG')).'.php');
Think::buildApp()作用:引入相关配置文件
再运行App::run(); App类下的run()方法
5.ThinkPHP/Lib/Core/App.class.php
static public function run() { // 项目初始化标签 tag('app_init');
App::init(); // 项目开始标签 tag('app_begin'); // Session初始化 session(C('SESSION_OPTIONS')); // 记录应用初始化时间 G('initTime');
App::exec(); // 项目结束标签 tag('app_end'); return ; }
5.1.执行自己类的静态方法,App::init();
static public function init() {
Dispatcher::dispath(); 分析路由
//分析路由(控制器MODEL_NAME,方法ACTION_NAME) 之前使用MVC index.php?c=控制器&a=方法 }
5.2.App::exec();方法
static public function exec() { if(!preg_match('/^[A-Za-z](\w)*$/',MODULE_NAME)){ // 安全检测 $module = false; }else{ //正常应该进入else //创建Action控制器实例 $group = defined('GROUP_NAME') && C('APP_GROUP_MODE')==0 ? GROUP_NAME.'/' : ''; $module = A($group.MODULE_NAME); //$module = new IndexAction; A方法是new方法,实例化对象 //控制器对象 } if(!$module) { //控制器没有对象 if(){ } if(){ }else{ //有对象 } } try{ //控制器对象如何调用自己的相关方法 //$model -> $action(); $method = new ReflectionMethod($module, $action); //控制器对象调用本身的方法 $model->invoke($model); } }
App::run()作用:控制器被实例化,控制器中的方法被执行