ThinkPHP3.2 大致流程

首先:入口文件

// 檢測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)的方法,調用方法用到了類反射,最後就是控制器調用視圖顯示頁面。

畢~

差不多了,學習總結,如有錯誤,請留言告知,筆者將不勝感激


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章