跟着分析的thinkphp版本是:5.0.24
首先包含了 start.php
跟進base.php,該文件主要實現的是 定義了一些常量 和 引入了 Loader類 來實現自動加載
繼續跟進Loader.php中,還沒進行任何操作,也沒有構造方法,包含完了之后加載了一些配置文件就開始執行 三個方法
首先執行的第一個是:注冊自動加載
// 注冊自動加載
\think\Loader::register();
register會使用 spl_autoload_register 該函數會使用 think\Loader::autoload 去注冊自動加載
然后走下面 Composer 自動加載支持,registerComposerLoader該方法 自動去加載一些用到的類
繼續走它會先定義 命名空間
self::addNamespace([
'think' => LIB_PATH . 'think' . DS,
'behavior' => LIB_PATH . 'behavior' . DS,
'traits' => LIB_PATH . 'traits' . DS,
]);
再加載類庫映射文件
if (is_file(RUNTIME_PATH . 'classmap' . EXT)) {
self::addClassMap(__include_file(RUNTIME_PATH . 'classmap' . EXT));
}
這里走完了之后就出來了,繼續走 注冊錯誤和異常處理機制
// 注冊錯誤和異常處理機制
\think\Error::register();
繼續跟進
這里調用的是\think\Error
不存在,所以會讓 think\Loader::autoload 去自動加載,那么就會先進autoload方法中,其中的步驟就是 檢測命名空間別名 ,然后去找你要實例化的類文件是否存在,存在的話則去包含該文件
包含完了之后開始 register 方法
public static function register()
{
error_reporting(E_ALL); // 開啟所有的錯誤報告
set_error_handler([__CLASS__, 'appError']);
set_exception_handler([__CLASS__, 'appException']);
register_shutdown_function([__CLASS__, 'appShutdown']);
}
將錯誤、異常、中止時分別交由 appError 、appException 、 appShutdown 處理,這三個函數在 thinkphp/library/think/Error.php 中定義
接着加載配置文件
最后跳出 base.php中 然后開始 App:run()->send(),這個自己分開記錄了!!
參考文章:https://y4er.com/post/thinkphp5-source-read/#框架引導startphp