Think\Think 位於 ThinkPHP/Library/Think/Think.class.php,是框架最核心的「大管家」類,統籌配置加載、別名映射、實例管理、自動加載、異常/錯誤處理、行為擴展等職責,典型的「上帝類」反模式 (違反單一職責),但也體現了框架啟動的完整邏輯。
namespace Think;
class Think {
private static $_map = []; // 類庫別名映射
private static $_instance = []; // 實例容器 (單例/工廠)
static public function start() {} // 應用初始化入口
static public function addMap($class, $map='') {} // 註冊映射
static public function getMap($class='') {} // 獲取映射
public static function autoload($class) {} // 自動加載
static public function instance($class,$method='') {} // 獲取實例
static public function appException($e) {} // 異常處理
static public function appError($errno,$errstr,$errfile,$errline) {} // 錯誤處理
static public function fatalError() {} // 致命錯誤捕獲
static public function halt($error) {} // 錯誤輸出
static public function trace($val='[think]',$label='',$level='DEBUG',$record=false) {} // Trace 記錄
}
static public function start() {
// 1. 註冊自動加載 (spl_autoload_register 優於 __autoload)
spl_autoload_register('Think\Think::autoload');
// 2. 註冊關機/錯誤/異常處理器
register_shutdown_function('Think\Think::fatalError');
set_error_handler('Think\Think::appError');
set_exception_handler('Think\Think::appException');
// 3. 初始化分布式存儲
Storage::connect(STORAGE_TYPE);
// 4. 運行緩存機制 (非調試模式)
$runtimefile = RUNTIME_PATH . APP_MODE . '~runtime.php';
if (!APP_DEBUG && Storage::has($runtimefile)) {
Storage::load($runtimefile); // 直接加載編譯緩存
} else {
// 4.1 加載運行模式配置
$mode = include is_file(CONF_PATH.'core.php') ? CONF_PATH.'core.php' : MODE_PATH.APP_MODE.'.php';
// 4.2 加載核心類/函數文件
foreach ($mode['core'] as $file) {
if (is_file($file)) {
include $file;
if (!APP_DEBUG) $content .= compile($file);
}
}
// 4.3 加載配置文件 (支持多維配置)
foreach ($mode['config'] as $key=>$file) {
is_numeric($key) ? C(include $file) : C($key, include $file);
}
// 4.4 加載模式專用配置
if ('common' != APP_MODE && is_file(CONF_PATH.'config_'.APP_MODE.'.php'))
C(include CONF_PATH.'config_'.APP_MODE.'.php');
// 4.5 註冊別名映射
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');
// 4.6 導入行為擴展 (Hook)
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');
// 4.7 加載語言包
L(include THINK_PATH.'Lang/'.strtolower(C('DEFAULT_LANG')).'.php');
// 4.8 生成運行緩存文件
if (!APP_DEBUG) {
$content .= "\nnamespace { Think\Think::addMap(".var_export(self::$_map,true).");";
$content .= "\nL(".var_export(L(),true).");\nC(".var_export(C(),true).");";
$content .= "Think\Hook::import(".var_export(Hook::get(),true).");}";
Storage::put($runtimefile, strip_whitespace('
別名映射機制:addMap() / getMap()
利用靜態 $_map 存儲 別名 => 實際路徑,提升自動加載效率:
static public function addMap($class, $map='') {
if (is_array($class)) {
self::$_map = array_merge(self::$_map, $class);
} else {
self::$_map[$class] = $map;
}
}
static public function getMap($class='') {
return '' === $class ? self::$_map : (isset(self::$_map[$class]) ? self::$_map[$class] : null);
}
設計評價與改進建議
Bootstrap、ConfigManager、AliasLoader、ErrorHandler 等獨立組件,採用依賴注入容器管理。