base.php运行过程解析
功能有以下三点
- 定义系统运行常量
- 引入Loader类
- 注册自动加载类、注册异常处理类、引入管理配置信息
对应四行代码
require CORE_PATH . 'Loader.php';
\think\Loader::register();
\think\Error::register();
\think\Config::set(include THINK_PATH . 'convention' . EXT);
Loader.php
常量定义就在这里不重复了。
先来说说Loader.php,从文件名称上也能大概猜到是与加载功能相关,其类内部存在与composer相似的定义变量,这里不列举,为了存储命名空间的映射等信息。
列举下内部调用方法,逐个说明稍微有点多。
Loader::register()方法
//注册系统自动加载 加载方法为类内部的autoload方法,同时设置若无法注册则抛出异常,并添加函数到队列首部
spl_autoload_register($autoload ?: 'think\\Loader::autoload', true, true);
//判断vendor内部是否存在composer目录,一般都是存在的,如果没有,我们也最好养成使用composer的习惯。
if (PHP_VERSION_ID >= 50600 && is_file(VENDOR_PATH . 'composer' . DS . 'autoload_static.php')) {
//判断PHP的版本号和autoload_static.php文件存在
require VENDOR_PATH . 'composer' . DS . 'autoload_static.php';
//因为composer/autoload_static.php内包含类的类名是无规则的,所以通过查找declared类并通过array_pop出栈操作获取
$declaredClass = get_declared_classes();
$composerClass = array_pop($declaredClass);
//property_exists — 检查对象或类是否具有该属性
foreach (['prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files'] as $attr) {
//若如上几个静态属性存在,则复制到当前类,用于后续的自动加载
if (property_exists($composerClass, $attr)) {
self::${$attr} = $composerClass::${$attr};
}
}
}
autoload_static.php已包含指定文件composer实现的自动加载规则&#