1. 程式人生 > >thinkphp5 源碼分析二 框架引導

thinkphp5 源碼分析二 框架引導

ase 文件 loader esp register behavior llb err filename

框架引導文件源代碼 (/thinkphp/start.php)

1. 引入基礎文件(/thinkphp/base.php)

// 加載基礎文件
require __DIR__ . ‘/base.php‘;

基礎文件(/thinkphp/base.php)

2. 定義系統常量

 1 define(‘THINK_VERSION‘, ‘5.0.9‘);
 2 define(‘THINK_START_TIME‘, microtime(true));
 3 define(‘THINK_START_MEM‘, memory_get_usage());
 4 define(‘EXT‘, ‘.php‘);
 5 define
(‘DS‘, DIRECTORY_SEPARATOR); 6 defined(‘THINK_PATH‘) or define(‘THINK_PATH‘, __DIR__ . DS); 7 define(‘LIB_PATH‘, THINK_PATH . ‘library‘ . DS); 8 define(‘CORE_PATH‘, LIB_PATH . ‘think‘ . DS); 9 define(‘TRAIT_PATH‘, LIB_PATH . ‘traits‘ . DS); 10 defined(‘APP_PATH‘) or define(‘APP_PATH‘, dirname($_SERVER
[‘SCRIPT_FILENAME‘]) . DS); 11 defined(‘ROOT_PATH‘) or define(‘ROOT_PATH‘, dirname(realpath(APP_PATH)) . DS); 12 defined(‘EXTEND_PATH‘) or define(‘EXTEND_PATH‘, ROOT_PATH . ‘extend‘ . DS); 13 defined(‘VENDOR_PATH‘) or define(‘VENDOR_PATH‘, ROOT_PATH . ‘vendor‘ . DS); 14 defined(‘RUNTIME_PATH‘) or define
(‘RUNTIME_PATH‘, ROOT_PATH . ‘runtime‘ . DS); 15 defined(‘LOG_PATH‘) or define(‘LOG_PATH‘, RUNTIME_PATH . ‘log‘ . DS); 16 defined(‘CACHE_PATH‘) or define(‘CACHE_PATH‘, RUNTIME_PATH . ‘cache‘ . DS); 17 defined(‘TEMP_PATH‘) or define(‘TEMP_PATH‘, RUNTIME_PATH . ‘temp‘ . DS); 18 defined(‘CONF_PATH‘) or define(‘CONF_PATH‘, APP_PATH); // 配置文件目錄 19 defined(‘CONF_EXT‘) or define(‘CONF_EXT‘, EXT); // 配置文件後綴 20 defined(‘ENV_PREFIX‘) or define(‘ENV_PREFIX‘, ‘PHP_‘); // 環境變量的配置前綴 21 // 環境常量 22 define(‘IS_CLI‘, PHP_SAPI == ‘cli‘ ? true : false); 23 define(‘IS_WIN‘, strpos(PHP_OS, ‘WIN‘) !== false);

3. 載入Loader類(/thinkphp/library/think/Loader.php)

// 載入Loader類
require CORE_PATH . ‘Loader.php‘;

4. 加載環境變量配置文件(/.env)

 1 // 加載環境變量配置文件
 2 if (is_file(ROOT_PATH . ‘.env‘)) {
 3     $env = parse_ini_file(ROOT_PATH . ‘.env‘, true);
 4     foreach ($env as $key => $val) {
 5         $name = ENV_PREFIX . strtoupper($key);
 6         if (is_array($val)) {
 7             foreach ($val as $k => $v) {
 8                 $item = $name . ‘_‘ . strtoupper($k);
 9                 putenv("$item=$v");
10             }
11         } else {
12             putenv("$name=$val");
13         }
14     }
15 }

5. 註冊自動加載

// 註冊自動加載
\think\Loader::register();

Loader類(/thinkphp/library/think/Loader.php)

6. 註冊系統自動加載

// 註冊系統自動加載
spl_autoload_register($autoload ?: ‘think\\Loader::autoload‘, true, true);

7. 註冊命名空間定義

1 // 註冊命名空間定義
2  self::addNamespace([
3     ‘think‘    => LIB_PATH . ‘think‘ . DS,
4     ‘behavior‘ => LIB_PATH . ‘behavior‘ . DS,
5     ‘traits‘   => LIB_PATH . ‘traits‘ . DS,
6  ]);

註冊的命名空間 技術分享

8. 加載類庫映射文件(/runtime/classmap.php)

1 // 加載類庫映射文件
2 if (is_file(RUNTIME_PATH . ‘classmap‘ . EXT)) {
3    self::addClassMap(__include_file(RUNTIME_PATH . ‘classmap‘ . EXT));
4 }

9. composer自動加載(/vendor/composer/)

1 // Composer自動加載支持
2 if (is_dir(VENDOR_PATH . ‘composer‘)) {
3     self::registerComposerLoader();
4 }

10. 自動加載extend目錄(/extend)

// 自動加載extend目錄
self::$fallbackDirsPsr4[] = rtrim(EXTEND_PATH, DS);

11. 註冊錯誤和異常處理機制(/thinkphp/library/think/Error.php)

1 // 報告所有錯誤
2 error_reporting(E_ALL);
3 //設置用戶自定義的錯誤處理程序
4 set_error_handler([__CLASS__, ‘appError‘]);
5 // 設置用戶定義的異常處理函數
6 set_exception_handler([__CLASS__, ‘appException‘]);
7 //定義PHP程序執行完成後執行的函數
8 register_shutdown_function([__CLASS__, ‘appShutdown‘]);

12. 加載慣例配置文件(/thinkphp/convention.php)

1 // 加載慣例配置文件
2 \think\Config::set(include THINK_PATH . ‘convention‘ . EXT);

thinkphp5 源碼分析二 框架引導