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()作用:控制器被实例化,控制器中的方法被执行

posted @ 2015-02-03 10:53  访问控制列表  阅读(391)  评论(0编辑  收藏  举报