🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 注册自动加载机制 注册自动加载机制文件位于`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)