thinkphp5 源码分析二 框架引导

框架引导文件源代码 (/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);
时间: 2024-10-19 10:17:56

thinkphp5 源码分析二 框架引导的相关文章

TOMCAT源码分析(启动框架)

建议: 毕竟TOMCAT的框架还是比较复杂的, 单是从文字上理解, 是不那么容易掌握TOMCAT的框架的. 所以得实践.实践.再实践. 建议下载一份TOMCAT的源码, 调试通过, 然后单步跟踪其启动过程. 如果有不明白的地方, 再来查阅本文, 看是否能得到帮助. 我相信这样效果以及学习速度都会好很多! 1. Tomcat的整体框架结构 Tomcat的基本框架, 分为4个层次. Top Level Elements: Server Service Connector HTTP AJP Conta

baksmali和smali源码分析(二)

这一节,主要介绍一下 baksmali代码的框架. 我们经常在反编译android apk包的时候使用apktool这个工具,其实本身这个工具里面对于dex文件解析和重新生成就是使用的baksmali 和smali这两个jar包其中 baksmali是将 dex文件转换成便于阅读的smali文件的,具体使用命令如下:java -jar baksmali.jar classes.dex -o myout其中myout是输出的文件夹 而smali是将smali文件重新生成回 dex文件的具体使用的命

netty 源码分析二

以服务端启动,接收客户端连接整个过程为例分析, 简略分为 五个过程: 1.NioServerSocketChannel 管道生成, 2.NioServerSocketChannel 管道完成初始化, 3.NioServerSocketChannel注册至Selector选择器, 4.NioServerSocketChannel管道绑定到指定端口,启动服务 5.NioServerSocketChannel接受客户端的连接,进行相应IO操作 Ps:netty内部过程远比这复杂,简略记录下方便以后回忆

[Android]Volley源码分析(二)Cache

Cache作为Volley最为核心的一部分,Volley花了重彩来实现它.本章我们顺着Volley的源码思路往下,来看下Volley对Cache的处理逻辑. 我们回想一下昨天的简单代码,我们的入口是从构造一个Request队列开始的,而我们并不直接调用new来构造,而是将控制权反转给Volley这个静态工厂来构造. com.android.volley.toolbox.Volley: public static RequestQueue newRequestQueue(Context conte

哇!板球 源码分析二

游戏主页面布局 创建屏下Score标签 pLabel = CCLabelTTF::create("Score", "Arial", TITLE_FONT_SIZE); //分数标签 //设置标签字体的颜色 pLabel->setColor (ccc3(0, 0, 0)); //设置文本标签的位置 pLabel->setPosition ( ccp ( SCORE_X, //X坐标 SCORE_Y //Y坐标 ) ); //将文本标签添加到布景中 this

【梦幻连连连】源码分析(二)

转载请注明出处:http://blog.csdn.net/oyangyufu/article/details/24736711 GameLayer场景界面效果: 源码分析: GameLayer场景初始化,主要是初始化加载界面及背景音乐 bool GameLayer::init() { float dt=0.0f; if ( !CCLayerColor::initWithColor(ccc4(255, 255, 255, 255))) { return false; } this->initLoa

[Android]Fragment源码分析(二) 状态

我们上一讲,抛出来一个问题,就是当Activity的onCreateView的时候,是如何构造Fragment中的View参数.要回答这个问题我们先要了解Fragment的状态,这是Fragment管理中非常重要的一环.我们先来看一下FragmentActivity提供的一些核心回调: @Override protected void onCreate(Bundle savedInstanceState) { mFragments.attachActivity(this, mContainer,

JAVA Collection 源码分析(二)之SubList

昨天我们分析了ArrayList的源码,我们可以看到,在其中还有一个类,名为SubList,其继承了AbstractList. // AbstractList类型的引用,所有继承了AbstractList都可以传进来 private final AbstractList<E> parent; // 这个是其实就是parent的偏移量,从parent中的第几个元素开始的 private final int parentOffset; private final int offset; int s

Tomcat源码分析二:先看看Tomcat的整体架构

Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server.Service.Connector.Container等组件,接下来我们一起去大致的看看这些组件的作用和他们之间的相互联系.在这之前,我们先补充一个知识点,也就是Tomcat它实现的功能点是什么呢?通过查找一些资料,这里参考下极客时间<深入拆解Tomcat_Jetty>中的总结,即Tomcat 要实现 2 个核心功能: