thinkphp3.2.3原始碼學習(3)

ZVan發表於2018-11-09
/**
     * 應用程式初始化
     * @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';
      if(!APP_DEBUG && Storage::has($runtimefile)){
          Storage::load($runtimefile);
      }else{
          if(Storage::has($runtimefile))
              Storage::unlink($runtimefile);
          $content =  '';
          // 讀取應用模式
          $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');
      // 執行應用
      App::run();
    }
複製程式碼
  1. 註冊autoload方法
  2. 設定錯誤和異常處理
  3. 初始化檔案儲存方式
  4. 初始化快取檔案。如果不是除錯模式,且快取檔案存在的話,就載入快取
  5. 否則,有快取的話,就刪除快取檔案。
  6. 引入Mode/common.php 裡面的core,如果對應的檔案存在的話,就引入檔案。如果不是除錯模式的話,content就等於編譯檔案。
    // 函式和類檔案
    'core'      =>  array(
        THINK_PATH.'Common/functions.php',
        COMMON_PATH.'Common/function.php',
        CORE_PATH . 'Hook'.EXT,
        CORE_PATH . 'App'.EXT,
        CORE_PATH . 'Dispatcher'.EXT,
        //CORE_PATH . 'Log'.EXT,
        CORE_PATH . 'Route'.EXT,
        CORE_PATH . 'Controller'.EXT,
        CORE_PATH . 'View'.EXT,
        BEHAVIOR_PATH . 'BuildLiteBehavior'.EXT,
        BEHAVIOR_PATH . 'ParseTemplateBehavior'.EXT,
        BEHAVIOR_PATH . 'ContentReplaceBehavior'.EXT,
    ),
複製程式碼
  1. 載入配置檔案
    'config'    =>  array(
        THINK_PATH.'Conf/convention.php',   // 系統慣例配置
        CONF_PATH.'config'.CONF_EXT,      // 應用公共配置
    ),
複製程式碼
  1. 如果APP_MODE不等於common的話,讀取當前應用模式對應的配置檔案
  2. 載入模式行為定義
  3. 載入應用行為定義
  4. 載入框架底層語言包
  5. 讀取當前應用狀態對應的配置檔案
  6. 設定系統時區
  7. 檢查應用目錄結構,如果不存在則自動建立
  8. 記錄載入檔案時間
  9. APP:run()

相關文章