ThinkPHP3.1.3源碼分析(四) Think.class.php
一開始的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?; ????????????} ????????}
節(jié)選代碼,主要的寫法 就是 根據(jù)類名的后綴 如 abcBehavior 這搜索默認Behavior的文件夾里 有沒有對應的類文件
找到了 就return
沒有找到,則
?//?根據(jù)自動加載路徑設置進行嘗試搜索 ????????$paths??=???explode(',',C('APP_AUTOLOAD_PATH')); ????????foreach?($paths?as?$path){ ????????????if(import($path.'.'.$class)) ????????????????//?如果加載類成功則返回 ????????????????return?; ????????}
3、編譯項目
其實即使將 runtime.php 流程中定義的常量和應用的文件 都包含在了一個文件中 ~runtime.php
這樣可以加快運行速度,減少io開銷