企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] * * * * * ## 1 框架引导文件源代码 > 独立模式(/thinkphp/start.php) ~~~ namespace think; require __DIR__ . '/base.php'; require CORE_PATH . 'Loader.php'; if (is_file(ROOT_PATH . 'env' . EXT)) { $env = include ROOT_PATH . 'env' . EXT; foreach ($env as $key => $val) { $name = ENV_PREFIX . $key; putenv("$name=$val"); } } if (!defined('APP_DEBUG')) { $debug = getenv(ENV_PREFIX . 'APP_DEBUG'); define('APP_DEBUG', $debug); } $mode = require MODE_PATH . APP_MODE . EXT; if (isset($mode['namespace'])) { Loader::addNamespace($mode['namespace']); } Loader::register(); if (isset($mode['alias'])) { Loader::addMap($mode['alias']); } Error::register(); if (isset($mode['config'])) { is_array($mode['config']) ? Config::set($mode['config']) : Config::load($mode['config']); } if (APP_HOOK && isset($mode['tags'])) { Hook::import($mode['tags']); } if (APP_AUTO_RUN) { App::run(); } ~~~ > composer包模式(\vendor\topthink\framework\start.php) ~~~ defined('THINK_AUTOLOAD') or define('THINK_AUTOLOAD', getenv('THINK_AUTOLOAD') !== '0'); if (THINK_AUTOLOAD) { require_once __DIR__ . '/think.php'; } ~~~ > (\vendor\topthink\framework\think.php) ~~~ namespace think; require __DIR__ . '/base.php'; require CORE_PATH . 'Loader.php'; if (is_file(ROOT_PATH . 'env' . EXT)) { $env = include ROOT_PATH . 'env' . EXT; foreach ($env as $key => $val) { $name = ENV_PREFIX . $key; putenv("$name=$val"); } } if (!defined('APP_DEBUG')) { $debug = getenv(ENV_PREFIX . 'APP_DEBUG'); define('APP_DEBUG', $debug); } $mode = require MODE_PATH . APP_MODE . EXT; if (isset($mode['namespace'])) { Loader::addNamespace($mode['namespace']); } Loader::register(); if (isset($mode['alias'])) { Loader::addMap($mode['alias']); } Error::register(); if (isset($mode['config'])) { is_array($mode['config']) ? Config::set($mode['config']) : Config::load($mode['config']); } if (APP_HOOK && isset($mode['tags'])) { Hook::import($mode['tags']); } if (APP_AUTO_RUN) { App::run(); } ~~~ ## 2 源代码分析 > composer包模式(\vendor\topthink\framework\start.php) `defined('THINK_AUTOLOAD') or define('THINK_AUTOLOAD', getenv('THINK_AUTOLOAD') !== '0');` 检查加载器模式 ~~~ if (THINK_AUTOLOAD) { require_once __DIR__ . '/think.php'; } ~~~ 加载composer包的框架引导文件 * * * * * > 独立模式(\start.php)与composer包模式公共部分(\vendor\topthink\framework\think.php) ~~~ namespace think; ~~~ 使用think命名空间 命名空间的原理见基础原理的[php命名空间](http://www.kancloud.cn/zmwtp/tp5/119446)。 ~~~ require __DIR__.'base.php'; ~~~ ### 1 加载框架全局变量文件 具体内容见框架流程的[附:全局变量文件](http://www.kancloud.cn/zmwtp/tp5/119430) ~~~ require CORE_PATH.'Loader.php'; ~~~ ### 2 加载框架加载器 加载器文件的分析见框架流程的[附:自动加载器](http://www.kancloud.cn/zmwtp/tp5/119431) 加载器的原理见基础原理的[php的自动加载](http://www.kancloud.cn/zmwtp/tp5/119447) ~~~ $mode = require MODE_PATH.APP_MODE.EXT; ~~~ ### 3 加载框架的模式配置文件 模式配置文件的分析见框架流程的[附:模式配置文件](http://www.kancloud.cn/zmwtp/tp5/119432) 模式配置文件的操作见使用范例的[运行模式开发](http://www.kancloud.cn/zmwtp/tp5/120208) `Loader::register();` ### 4 注册自动加载器 ~~~ if (isset($mode['alias'])) { Loader::addMap($mode['alias']); } ~~~ ### 5 加载框架的模式别名文件 ~~~ Error::register() ~~~ ### 6 注册错误和异常处理 错误和异常机制见框架流程的[附:错误和异常处理文件](http://www.kancloud.cn/zmwtp/tp5/119433) ~~~ if (isset($mode['config'])) { is_array($mode['config']) ? Config::set($mode['config']) : Config::load($mode['config']); } ~~~ ### 7 加载模式默认全局配置文件 全局配置操作见框架流程的[附:全局配置文件](http://www.kancloud.cn/zmwtp/tp5/119434) ~~~ if (APP_HOOK && isset($mode['tags'])) { Hook::import(is_array($mode['tags']) ? $mode['tags'] : include $mode['tags']); } ~~~ ### 8 注册模式监听回调标签 监听文件内容见框架流程的行为[附:监听回调注册文件](http://www.kancloud.cn/zmwtp/tp5/119435) ~~~ if (APP_AUTO_RUN) { App::run(); } ~~~ ### 9 检测是否启动应用 跳转到应用启动App::run()运行。 ## 3 总结 框架启动中,根据入口文件public/index.php或者全局变量文件base.php中的**APP_MODE** 加载thinkphp/mode/下面对应的**模式配置文件** 然后根据模式配置文件(默认使用thinkphp/mode/common.php)的配置初**始化模式环境** 依次为**注册命名空间**,**注册类别名**,**加载模式配置文件**(默认为thinkphp/convention.php),**注册模式监听回调** 然后根据全局变量APP_AUTO_BUILD**自动创建应用目录** 最后**启动应用**App::run()。 框架启动文件,通常情况下不需要修改,其中涉及到的模式文件与运行模式开发有关,其使用思路见使用范例的[运行模式开发](http://www.kancloud.cn/zmwtp/tp5/120208)