Loader类中首先定义了一些静态数组:
```
/**
* @var array 实例数组
*/
protected static $instance = [];
/**
* @var array 类名映射
*/
protected static $classMap = [];
/**
* @var array 命名空间别名
*/
protected static $namespaceAlias = [];
/**
* @var array PSR-4 命名空间前缀长度映射
*/
private static $prefixLengthsPsr4 = [];
/**
* @var array PSR-4 的加载目录
*/
private static $prefixDirsPsr4 = [];
/**
* @var array PSR-4 加载失败的回退目录
*/
private static $fallbackDirsPsr4 = [];
/**
* @var array PSR-0 命名空间前缀映射
*/
private static $prefixesPsr0 = [];
/**
* @var array PSR-0 加载失败的回退目录
*/
private static $fallbackDirsPsr0 = [];
/**
* @var array 需要加载的文件
*/
private static $files = [];
```
// 注册自动加载
base.php中加载了Loader.php\\think\\Loader::register();执行了Loader.php文件中Loader类里的register方法,建议从register方法读起。Loader.php 类中的register 方法如下:
```
// 注册自动加载机制
public static function register($autoload = '')
{
// 注册系统自动加载
spl_autoload_register($autoload ?: 'think\\Loader::autoload', true, true);
// 注册命名空间定义
self::addNamespace([
'think' => LIB_PATH . 'think' . DS,
'behavior' => LIB_PATH . 'behavior' . DS,
'traits' => LIB_PATH . 'traits' . DS,
]);
// 加载类库映射文件
if (is_file(RUNTIME_PATH . 'classmap' . EXT)) {
self::addClassMap(__include_file(RUNTIME_PATH . 'classmap' . EXT));
}
// Composer自动加载支持
if (is_dir(VENDOR_PATH . 'composer')) {
self::registerComposerLoader();
}
// 自动加载extend目录
self::$fallbackDirsPsr4[] = rtrim(EXTEND_PATH, DS);
}
```
# 1:spl_autoload_register($autoload ?: 'think\\Loader::autoload', true, true);
/\*注册系统自动加载,加载不存在的类时,会执行此函数里的方法,$autoload一般为空值,所以加载不存在的类时,
执行的是think\\\\Loader::autoload,也就是当前类的autoload方法,think\\\\Loader为当前类的命名空间 \*/
# 2:Composer 自动加载支持(将在后续章节作为专题讲解)
# 3:注册命名空间定义
```
self::addNamespace([
'think' => LIB_PATH . 'think' . DS,
'behavior' => LIB_PATH . 'behavior' . DS,
'traits' => LIB_PATH . 'traits' . DS,
]);
```
# 4:加载类库映射文件
```
if (is_file(RUNTIME_PATH . 'classmap' . EXT)) {
self::addClassMap(__include_file(RUNTIME_PATH . 'classmap' . EXT));
}
```
# 5:自动加载 extend 目录
```
self::$fallbackDirsPsr4[] = rtrim(EXTEND_PATH, DS);
```
