## 注册自动加载机制
注册自动加载机制文件位于`thinkphp/library/think/Loader.php`,在`base.php`文件中,调用了`register()`方法,具体内容如下:
```
/**
* 注册自动加载机制
* @access public
* @param callable $autoload 自动加载处理方法
* @return void
*/
public static function register($autoload = null)
{
// 1. spl_autoload_register 函数是注册给定的函数作为 __autoload 的实现
spl_autoload_register($autoload ?: 'think\\Loader::autoload', true, true);
// Composer 自动加载支持
// 2. VENDOR_PATH = /WWW/tp5/vendor/ , 检查/WWW/tp5/vendor/composer是否存在,默认存在
if (is_dir(VENDOR_PATH . 'composer')) {
// 3. php版本必须大于5.6, /WWW/tp5/vendor/composer/autoload_static.php 必须存在
if (PHP_VERSION_ID >= 50600 && is_file(VENDOR_PATH . 'composer' . DS . 'autoload_static.php')) {
require VENDOR_PATH . 'composer' . DS . 'autoload_static.php';
// 4. get_declared_classes 函数返回由已定义类的名字所组成的数组
$declaredClass = get_declared_classes();
/*
print_r($declaredClass);
Array
(
[0] => stdClass
[1] => stdClass
[2] => Exception
[3] => ErrorException
[4] .... other defined classes....
[143] => XSLTProcessor
[144] => think\Loader
[145] => Composer\Autoload\ComposerStaticInit2bc4f313dba415539e266f7ac2c87dcd
)
*/
// 5. 获取composer类, array_pop 函数是弹出数组最后一个单元(出栈)
$composerClass = array_pop($declaredClass);
/*
print_r($composerClass);
Composer\Autoload\ComposerStaticInit2bc4f313dba415539e266f7ac2c87dcd
*/
foreach (['prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files'] as $attr) {
// 6. property_exists 函数是检查对象或类是否具有该属性, 并创建当前实例类的属性
if (property_exists($composerClass, $attr)) {
self::${$attr} = $composerClass::${$attr};
}
}
} else {
// 可以暂时忽略此代码逻辑
self::registerComposerLoader();
}
}
/*
print_r(self::$prefixLengthsPsr4);
Array
(
[t] => Array
(
[think\worker\] => 13
[think\oracle\] => 13
[think\mongo\] => 12
[think\migration\] => 16
[think\helper\] => 13
[think\composer\] => 15
[think\captcha\] => 14
[think\] => 6
)
[a] => Array
(
[app\] => 4
)
[W] => Array
(
[Workerman\] => 10
)
[P] => Array
(
[Phinx\] => 6
)
)
*/
// 7. 注册命名空间定义, 框架默认只有 think, traits, 没有behavior
self::addNamespace([
'think' => LIB_PATH . 'think' . DS,
'behavior' => LIB_PATH . 'behavior' . DS,
'traits' => LIB_PATH . 'traits' . DS,
]);
// 8. 加载类库映射文件, 可以忽略(默认没这文件)
if (is_file(RUNTIME_PATH . 'classmap' . EXT)) {
self::addClassMap(__include_file(RUNTIME_PATH . 'classmap' . EXT));
}
// 9. 加载composer自动加载文件
self::loadComposerAutoloadFiles();
// 自动加载 extend 目录
self::$fallbackDirsPsr4[] = rtrim(EXTEND_PATH, DS); // /WWW/tp5/extend/
/*
print_r(self::$fallbackDirsPsr4);
Array
(
[0] => /mnt/d/phpStudy/PHPTutorial/WWW/tp5/extend
)
*/
}
```
![](https://img.kancloud.cn/1d/69/1d69987e7818d0a091dd33c8f91b8eea_793x576.png)