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. 6.1-uC/OS-III软件定时器

    1.软件定时器是 uC/OS 操作系统的一个内核对象,软件定时器是基于时钟节拍和系统管理创建的软件性定时器,理论上可以创建无限多个,但精准度肯定比硬件定时稍逊一筹. 2.软件定时器启动之后是由软件定时 ...

  2. java框架之SpringBoot(1)-入门

    简介 Spring Boot 用来简化 Spring 应用开发,约定大于配置,去繁从简,just run 就能创建一个独立的.产品级别的应用. 背景: J2EE 笨重的开发.繁多的配置.低下的开发效率 ...

  3. GDB查看堆栈局部变量

    GDB查看堆栈局部变量 “参数从右到左入栈”,“局部变量在栈上分配空间”,听的耳朵都起茧子了.最近做项目涉及C和汇编互相调用,写代码的时候才发现没真正弄明白.自己写了个最简单的函数,用gdb跟踪了调用 ...

  4. python selenium webdriver入门基本操作

    python selenium webdriver入门基本操作 未经作者允许,禁止转载! from selenium import webdriver import time driver=webdr ...

  5. React 添加对 Less 的支持, 使用 create-react-app 脚手架

    ---恢复内容开始--- 参考博客与我自己的当前版本有一点出入, 所以就将 参考博客写到文章后面去了. 我的电脑:  系统: Ubuntu16.04, 1, 安装脚手架: create-react-a ...

  6. python操作excel的读、计算、写----xlrd、copy

    import xlrd from xlutils.copy import copy class ExcelUtil: def __init__(self,excel_path=None,index=N ...

  7. st2_057

    http://vulapps.evalbug.com/s_struts2_s2-057/ 这大概是全网复现st2-057环境最简单的操作了. 不过首先,你需要安装过docker,安装方法参考官方文档h ...

  8. tp 内置压缩文件zip

    一.解压缩zip文件 $zip = new ZipArchive;//新建一个ZipArchive的对象 /* 通过ZipArchive的对象处理zip文件 $zip->open这个方法的参数表 ...

  9. python多线程学习三

    本文希望达到的目标: 1.服务器端与线程池  (实例demo) 2.并发插入db与线程池(实例demo) 3.线程池使用说明 4.线程池源码解析 一.基于socket的服务器与线程池连接. 1.在i7 ...

  10. 200. Number of Islands(DFS)

    Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surro ...