ThinkPHP5.0源码学习之注册自动加载

ThinkPHP5框架的自动注册加载流程如下:
 
在base.php文件中,用一句代码 \think\Loader::register(); 实现自动加载机制的注册。
// 载入Loader类
require CORE_PATH . 'Loader.php';
 
// 注册自动加载
\think\Loader::register();
 
// 注册错误和异常处理机制
\think\Error::register();
 
为什么要使用自动加载呢,这是因为自动加载机制可以把主目录下的所有的类一次性全部加载进来,当使用尚未被定义的类(class)和接口(interface)时自动去加载。通过注册自动加载器,只要这些类能在主目录下找到,类在使用前就会被加载。
TP5中,自动加载的实现由think\Loader类库完成,自动加载规范符合PHP的PSR-4。
 
打开library/think/Loader.php,先看Loader类的register方法,核心代码如下:
首先进行的是注册系统自动加载,因为参数$autoload默认为空,所以 spl_autoload_register($autoload ?: 'think\\Loader::autoload', true, true); 这句代码可以简化为 spl_autoload_register('think\\Loader::autoload'); ,其作用是保证Loader类的加载。
一开始还觉得已经在base.php中引入Loader类了,为什么还要使用spl_autoload_register()函数注册自动加载呢?在base.php中看到注册自动加载后面是注册错误和异常处理机制,即 \think\Error::register(); ,使用的是think命名空间下Error类的register静态方法,而base.php并没有引入Error类文件,有了这个自动加载器,便可以在spl_autoload_register()函数指定的autoload()函数中得到一个参数think\Error,通过该函数来加载对应的类文件。autoload()函数先处理命名空间别名,然后通过findFile()函数处理映射关系得到真实的路径,最后加载文件。
 
加载完相关的类文件后,register()函数通过addNameSpace()函数注册命名空间和路径的关联,该函数中调用了addPsr4()函数,得到的结果是一个变量self::$prefixLengthsPsr4的数组:
// self::$prefixLengthsPsr4 PSR-4 命名空间前缀长度映射
Array
(
    [t] => Array
        (
            [think\] => 6
            [traits\] => 7
        )
    [b] => Array
        (
            [behavior\] => 9
        )
)
 
接着register()函数通过addClassMap()注册类名映射,数组合并到$map,字符串关联到$class,如果/runtime/classmap.php文件存在,就加载类库映射文件;通过rigisterComposerLoader()注册composer的自动加载,如果/vendor/composer目录存在,就进行composer的自动加载;最后加载extend目录,整个框架的自动加载就完成了。
posted @   鹿呦呦  阅读(697)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
主题色彩