牛骨文教育服务平台(让学习变的简单)
博文笔记

ThinkPHP3.2 大致流程

创建时间:2015-01-12 投稿人: 浏览次数:654

首先:入口文件

// 检测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;
// 应用初始化 
ThinkThink::start();

看到这里,我们就打开Think.class.php文件

文件主要讲的是大致流程,一些无关流程的方法就不介绍了

所以Think.class.php文件,主要熟悉+精通 start()方法

    /**
     * 应用程序初始化
     * @access public
     * @return void
     */
    static public function start() {
      // 注册AUTOLOAD方法
      spl_autoload_register("ThinkThink::autoload");      
      // 设定错误和异常处理
      register_shutdown_function("ThinkThink::fatalError");
      set_error_handler("ThinkThink::appError");
      set_exception_handler("ThinkThink::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  .=  "
namespace { ThinkThink::addMap(".var_export(self::$_map,true).");";
              $content  .=  "
L(".var_export(L(),true).");
C(".var_export(C(),true).");ThinkHook::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)的方法,调用方法用到了类反射,最后就是控制器调用视图显示页面。

毕~

差不多了,学习总结,如有错误,请留言告知,笔者将不胜感激


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。