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目录,整个框架的自动加载就完成了。

ThinkPHP5.0源码学习之注册自动加载的更多相关文章

  1. ThinkPHP5.0源码学习之注册错误和异常处理机制

    在base.php文件中,用一句代码\think\Error::register();实现错误和异常处理机制的注册. // 注册错误和异常处理机制 \think\Error::register(); ...

  2. ThinkPHP5.0源码学习之框架启动流程

    ThinkPHP5框架的启动流程图如下: ThinkPHP5的启动流程按照文件分为三步: 1.请求入口(public/index.php) 2.框架启动(thinkphp/start.php) 3.应 ...

  3. ThinkPHP5.0源码学习之缓存Cache(一)

    一.文件 1.缓存配置文件:thinkphp\convention.php 2.缓存文件:thinkphp\library\think\Cache.php 3.驱动目录:thinkphp\librar ...

  4. ThinkPHP5.0源码学习之执行应用

    一.应用启动 在/thinkphp/start.php文件中,用一句代码App::run()->send();实现应用的启动. // 执行应用 App::run()->send();   ...

  5. spring源码学习之bean的加载(三)

    接着二中的继续写,那个都超过1000行了,哈,需要重新写一个,要不太长了,我都看不下去了 7.4 初始化bean doCreateBean函数中有这样一行代码:这行代码中initializeBean函 ...

  6. spring源码学习之bean的加载(二)

    这是接着上篇继续写bean的加载过程,好像是有点太多了,因为bean的加载过程是很复杂的,要处理的情况有很多,继续... 7.创建bean 常规的bean的创建时通过doCreateBean方法来实现 ...

  7. 【requireJS源码学习02】data-main加载的实现

    前言 经过昨天的学习,我们大概了解到了requireJS的主要结构,这里先大概的回顾一下 首先从总体结构来说,require这里分为三块: ① newContext之前变量声明或者一些工具函数 ② n ...

  8. spring源码学习之bean的加载(一)

    对XML文件的解析基本上已经大致的走了一遍,虽然没有能吸收多少,但是脑子中总是有些印象的,接下来看下spring中的bean的加载,这个比xml解析复杂的多.这个加载,在我们使用的时候基本上是:Bea ...

  9. ThinkPHP5.0源码学习之缓存Cache(二)

    一.使用Cache类 TP5.0框架默认使用的是File文件缓存驱动,可以修改全局配置文件convention.php中的type,将其改为Redis,这样使用的就是Redis缓存驱动了.

随机推荐

  1. JDK 1.8 JVM的变化

    前言: 1.什么是JVM JVM的全称是 Java Virtual Machine(Java虚拟机),它通过模拟一个计算机来达到一个计算机所具有的功能. Java和实体计算机一样也必须有一套合适的指令 ...

  2. bugfree3.0.1-导入excel测试用例

    大多数项目里只用BugFree做缺陷管理工具,其实还可以通过该工具导入测试用例,记录测试结果,最后获得统计结果. 难点 1.导入文件要求XML格式: 2.一般我们的测试用例都是用excle文件存取,很 ...

  3. Python3学习之路~5.10 PyYAML模块

    Python也可以很容易的处理ymal文档格式,只不过需要安装一个模块,参考文档:http://pyyaml.org/wiki/PyYAMLDocumentation

  4. JAVA基础——集合——HashMap

    HashMap集合: 常用方法(JDK1.8):   从此映射中移除所有映射关系(元素): public void clear()   返回此 HashMap 实例的浅表副本:并不复制键和值本身: p ...

  5. Jenkins Pipeline脚本

    node { echo 'Hello World' } node 在Jenkins环境中分配一个执行器和工作空间. echo 在控制台输出中写入简单的字符串 try { timeout(time: 1 ...

  6. 深入理解Java虚拟机5-chap7-斗者2星

    一.类加载机制 1.类加载机制:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Class文件加载到内存,这就是类加载机制. 2.类型 ...

  7. mongoose findByIdAndUpdate不执行的解决方法

    请参考Mongoose的文档 1.findOneAndUpdate([query], [doc], [options], [callback]) 有callback传递才执行. 2.exec是prom ...

  8. 微信小程序组件封装

    第一步,在page下面新建一个template文件,如下图 第二部,在template.wxml中编写公用组件即要封装的代码模块 <!--pages/template/template.wxml ...

  9. centos上部署应用到tomcat

    tomcat部署JavaWeb项目分为下面的步骤: 1.删除tomcat按照目录的ROOT文件夹下的所有文件 2.把war包复制到ROOT文件下面,解压缩:jar -xvf xxxx.war; 3.结 ...

  10. gateway + jwt 网关认证

    思路: 全局过滤器对所有的请求拦截(生成token有效期30分钟,放入redis设置有效期3天.3天之类可以通过刷新接口自动刷新,超过3天需要重新登录.) 前端在调用接口之前先判断token是否过期( ...