ThinkPHP3.1.3原始碼分析(四) Think.class.php

程式碼修行者發表於2014-12-21

一開始的ThinkPHP.php 最後一行程式碼 就是 Think::start(); 

呼叫了 Think.class.php 的 start()方法

static public function start() {
        // 設定錯誤和異常處理
        register_shutdown_function(array('Think','fatalError'));
        set_error_handler(array('Think','appError'));
        set_exception_handler(array('Think','appException'));
        // 註冊AUTOLOAD方法
        spl_autoload_register(array('Think', 'autoload'));
        //[RUNTIME]
        Think::buildApp();         // 預編譯專案
        //[/RUNTIME]
        // 執行應用
        App::run();
        return ;
    }
這個類最重要的是三部分

1、註冊錯誤、異常的處理方法

register_shutdown_function、set_error_handler、set_exception_handler


2、自動載入

if(substr($class,-8)=='Behavior') { // 載入行為
            if(require_array(array(
                CORE_PATH.'Behavior/'.$file,
                EXTEND_PATH.'Behavior/'.$file,
                LIB_PATH.'Behavior/'.$file,
                $libPath.'Behavior/'.$file),true)
                || (defined('MODE_NAME') && require_cache(MODE_PATH.ucwords(MODE_NAME).'/Behavior/'.$file))) {
                return ;
            }
        }
節選程式碼,主要的寫法 就是 根據類名的字尾 如 abcBehavior 這搜尋預設Behavior的資料夾裡 有沒有對應的類檔案
找到了 就return

沒有找到,則

 // 根據自動載入路徑設定進行嘗試搜尋
        $paths  =   explode(',',C('APP_AUTOLOAD_PATH'));
        foreach ($paths as $path){
            if(import($path.'.'.$class))
                // 如果載入類成功則返回
                return ;
        }


3、編譯專案

其實即使將 runtime.php 流程中定義的常量和應用的檔案 都包含在了一個檔案中 ~runtime.php

這樣可以加快執行速度,減少io開銷

相關文章