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. ARGB与RGB、RGBA的区别

    ARGB 是一种色彩模式,也就是RGB色彩模式附加上Alpha(透明度)通道,常见于32位位图的存储结构. RGB 色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变 ...

  2. 初学Vue 遇到Module not found:Error:Can`t resolve 'less-loader' 问题

    学习vue时,导入一个子组件时遇到Module not found:Error:Can`t resolve 'less-loader' 问题,实际上时在子组件中的样式里加了这么个代码 <styl ...

  3. C++的初始化成员列表

    class CExample { public: int a; float b; //构造函数初始化列表 CExample(): a(),b(8.8) {} //构造函数内部赋值 CExample() ...

  4. Unable to register MBean [HikariDataSource (HikariPool-0)] with key 'dataSou rce'; nested exception is javax.management.InstanceAlreadyExistsException: com.z axxer.hikari:name=dataSource,type=HikariDa

    今天启动项目看到已经启动起来,但是看到控制台有红色,没注意是什么问题,具体在细看下,发现是一个Tomcat中发布了两个实例. 解决办法:去发布路径下,全部删掉或者删掉不用的即可.

  5. MSG结构体和WndProc窗口过程详解

    MSG结构体和WndProc窗口过程对于Windows编程非常重要,如果不了解它们,可以说就没有学会Windows编程. MSG结构体 MSG 结构体用来表示一条消息,各个字段的含义如下: typed ...

  6. python locust 性能测试:locust 参数化(list) ---循环取数据,数据可重复使用

    from locust import TaskSet, task, HttpLocust class UserBehavior(TaskSet): def on_start(self): # 当模拟用 ...

  7. js中prototype,constructor的理解

    连看4篇前辈的文章,记录一些知识点 Javascript继承机制的设计思想 Javascript 面向对象编程(一):封装 Javascript面向对象编程(二):构造函数的继承 Javascript ...

  8. FractionallySizedBox

    import 'package:flutter/material.dart'; void main() { runApp(MaterialApp(home: new MyApp())); } clas ...

  9. Docker Kubernetes Service 代理服务创建

    Docker Kubernetes  Service 代理服务创建 创建Service需要提前创建好pod容器.再创建Service时需要指定Pod标签,它会提供一个暴露端口默会分配容器内网访问的唯一 ...

  10. mysql5.6 centos编译部署

    准备工作 创建用户 useradd mysql 删除老版本 rpm -qa |grep mysql rep -e mysql包 重命名默认的mysql配置文件 mv /etc/my.cnf /etc/ ...