想了很久终于要开始系列文章的编写了,期望是写出提升和面试都可以搞定的系列文章。 当你看到本文时,如果你发现咔咔没有编写到的面试热点问题或者技术难点,期待评论区指出,一起完善。

前言

目前再整理PHP进阶路线图,如有好的建议咔咔会第一时间进行收录。

一、自动加载loader源码分析

1-1 学习目标

  • 类的自动加载
  • 类自动加载的两种方式
  • spl_autoload_register必须会使用
  • 实现自定义文件的类的自动加载

1-2 Composer加载

从上图咔咔给的解析图,在base.php中首先加载了loader类,接着调用了register这个方法。

来到thinkphplibraryhinkLoader.php有一个register的方法,在这个方法里边,我们先学习第一个知识点spl_autoload_register()聊聊spl_autoload_register前世今生和简单使用,直接点击即可查看。

紧接着就是项目的根路径和composer的路径。

从这里开始就是在加载composer文件,过程也是很简单

  • 1.判断composer是否为目录
  • 2.判断路径下面的autoload_static.php是否为文件
  • 3.引入autoload_static.php文件
  • 4.返回所有已经声明的所有类 数组返回
  • 5.获取最后一个类ComposerStaticInit30742487e00917c888d89ba216f165b9
  • 6.判断ComposerStaticInit30742487e00917c888d89ba216f165b9中是否存在数组中的数据

接着可以去vendorcomposerautoload_static.php文件中可以看到这俩个属性

这里有一段代码估计有一部分同学会在这里绕一下self::${$attr} = $composerClass::${$attr};,这里的$attr就是'prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files'这些数据,外层在加一个$符号。

从而在ComposerStaticInit30742487e00917c888d89ba216f165b9这个类中直接获取对应的属性值,也就是上图的俩个属性值。

1-3 注册命名空间

文件还是thinkphplibraryhinkLoader.php的register方法

在这里注册了俩个命令空间,分别为think和traits。然后会进入到addNamespace这个方法中

在addNamespace方法中,添加了Psr4空间

接着来到addPsr4这个方法,会把这俩个命名空间都注册到ComposerStaticInit1e269472f484e157e90227b420ffca7a类的$prefixLengthsPsr4和$prefixDirsPsr4这俩个属性中

为了验证上面做一个断点调试,看到这些数据就应该清晰了,至于traits也是一样的注册方式。

截止到这里命名空间就注册完成了,接下来研究一下psr4命名空间是个什么东东。

1-4 Psr4是什么玩意

psr是简单的理解就是文件路径、自动加载对应类的相关规范、目前TP5.1使用的是psr4规范

此处的类是指class、接口、超类结构

一个完整的类需要一下结构()*

以下规范来源于PHP文档

  • 完整的类名必须要有一个顶级命名空间,被称为 "vendor namespace";
  • 完整的类名可以有一个或多个子命名空间;
  • 完整的类名必须有一个最终的类名;
  • 完整的类名中任意一部分中的下滑线都是没有特殊含义的;
  • 完整的类名可以由任意大小写字母组成;
  • 所有类名都必须是大小写敏感的。

以下是官方给的一个例子,这个psr规范能理解就尽量去理解它

1-5 加载类库映射文件

到这里,肯定会有一个疑问,这里怎么没有classmap.php这个文件。

最终会走到addClassMap这个方法,在这个方法中,只是把classmap.php这个文件的数据赋值给$classMap 而已,没有什么其它的用法

1-6 自动加载extend目录

extend这个目录用过TP框架的都多少用过的,在这个目录里边可以存放一下自定义的类库文件。

根据下图可以看到就是使用addAutoLoadDir这个方法进行加载的

在方法中也仅仅是把extend的路径赋值给了$fallbackDirsPsr4这个属性。

截止到这里Loader::register();这部分就结束了,接着我们深入的看一下内部实现和实践案例。

在以上阅读源码中有四个属性,简单的整理一下

二、简说类的加载过程

在刚刚开始解析这里的源码时就有一个函数spl_autoload_register

当需要使用的类没有被引入时,这个函数会在PHP报错前被触发,未定义的类名会被当作参数传入这里会直接去执行thinkLoader::autoload这个方法

经过断点第一个未加载的类就是thinkError

为什么是thinkError呢!可以在回到thinkphp/base.php看一下,当自动加载完执行完成后第一个执行的类就是Error

可以简单的做个测试,将这Error改为Kaka,进行打印一下,这时的类就改变为Kaka。到这里大家对这个类的自动加载机制就有一定的了解了。

当使用的类没有被引入时会把这个类当做参数传到thinkphp/library/think/Loader.php的autoload方法中。

到这里在进行看一下autoload这个方法

先从findFile这个方法走,把未因为的类传入这个方法中,在findFile这个方法中会直接从classMap这个属性中直接把thinkError这个类映射的文件直接返回出来

将thinkError这个类的完整路径返回给autoload的file变量后,把win环境的大小写给判断了一次。

然后直接使用include引入文件即可,直到返回。

直到这里就是一次完整的类的自动加载解析。

虽然到这里结束了,但是还是得再提一点就是$classMap这个属性,这个属性是基于文件classmap.php来到,这个文件的生成也是需要执行命令php think optimize:autoload生成的。

当没有生成这个文件时程序是如何执行的呢!

之前的所有流程都是一样的,只有在findFile这里不一样,接下来进行简单的梳理一下。

这时代码肯定不会走classMap

先获取thinkError文件

然后经过Composer自动加载中的俩个属性进行获取命名空间,在把thinkError.php文件进行拼接

最终返回的结果也是D:phpstudy_proWWWThinkPHPSourceCodeAnalysishinkphplibraryhinkError.php这个文件。

这里的代码需要好好的阅读一下。

类的自动加载到这里就是完全结束了。

三、自定义文件如何实现类的自动加载

先创建一个文件夹kaka

这时在控制器index中引入文件Kaka.php

直接进行访问,这时这个类肯定会报错,那么我们应该怎么操作一下,就可以直接访问呢!

这个时候就体现到源码的重要性了,还记得在自动加载的register函数中,加载过extend目录

这时再加一个kaka这个目录,直接进行访问一下

没毛病,直接就出来了。一切OK

在这里再聊一下关于extent的加载方式

在之前聊注册自动加载类库目录只是说明了一下只是把路径存到了$fallbackDirsPsr4属性,没有细细说,接下来就是说明这些了。

阅读源码只能是实现那然后查看那

只要是定义的类都会进去到autoload进行自动加载

同样也会进入到findFile这个方法

在findFile这个方法中可以看到这段代码,这个属性是不是很熟悉,就是自动加载extend目录时添加到$fallbackDirsPsr4属性的。

当在findFile中打印参数class时看一下数据

很清楚地可以看到testKaka这个类

此时再打印一下这个$fallbackDirsPsr4属性里边返回的file

然后就是使用__include_file来直接includeD:phpstudy_proWWWThinkPHPSourceCodeAnalysiskakaestKaka.php我们定义的文件。

以上的这个自定义文件如何实现类的自动加载,并且也就是extend的加载方式

四、总结

关于类自动加载的所有流程就完成了,如有错误之处可以在评论区哦!

❝ 坚持学习、坚持写博、坚持分享是咔咔从业以来一直所秉持的信念。希望在偌大互联网中咔咔的文章能带给你一丝丝帮助。我是咔咔,下期见。

thinkphp 框架自动加载原理_这下你应该理解ThinkPHP的Loader自动加载了相关推荐

  1. ThinkPHP框架的.env读取原理

    ThinkPHP框架的.env读取原理 <?phpclass Env {static $initialize;/*** 获取环境变量值* @access public* @param strin ...

  2. JPA/hibernate懒加载原理分析及JSON格式API反序列化时连环触发懒加载问题的解决

    什么是懒加载 JPA是java持久层的API,也就是java官方提供的一个ORM框架,Spring data jpa是spring基于hibernate开发的一个JPA框架.Spring data j ...

  3. java 滚动加载数据_[Java教程]浏览器滚动条快到底部时自动加载数据

    [Java教程]浏览器滚动条快到底部时自动加载数据 0 2015-11-30 15:00:44 1 2 3 4 5 6 ");24 main.append(" hello worl ...

  4. mysql驱动加载原理_老调重弹:JDBC系列 之 lt;驱动载入原理全面解析gt;

    前言 近期在研究Mybatis框架,因为该框架基于JDBC.想要非常好地理解和学习Mybatis,必需要对JDBC有较深入的了解.所以便把JDBC 这个东东翻出来.好好总结一番,作为自己的笔记,也是给 ...

  5. 小车自动往返工作原理_自动门厂家为你讲解各类自动门工作原理

    自动门厂家为你讲解各类自动门工作原理 凯撒自动门作为一家专业门控企业,自动门生产厂家,畅谈各种自动门的概念和工作原理.凯撒门控公司认为,自动门是指当人们接近或离开时能够自动打开和关闭的门扇.门扇的智能 ...

  6. 小车自动往返工作原理_自动往返小车

    摘要:设计了一个自动往返和智能控制的小车.采用MSP430F149为核心芯片,选用双全桥驱动芯片作为小车电机驱动,利用PWM技术动态控制电动机的转速,红外线光电传感器检测标识线,U型红外光电传感器测量 ...

  7. 小车自动往返工作原理_自动气象站的工作原理介绍

    FT-ZDQX自动气象站的工作原理*自动气象站的工作原理*自动气象站的工作原理*自动气象站的工作原理FT - ZDQX 자동 기상 관측소 의 작 동 원리 * 자동 기상 관측소 의 작 동 원리 ...

  8. 小车自动往返工作原理_自动往返小汽车

    1.任务与要求 设计并制作一个能自动往返于起跑线与终点之间的小汽车.允许用玩具汽车改装,但不能用人工遥控(包括有线遥控和无线遥控). 赛道宽度为0.5 m,表面贴有白纸,两侧有挡板,挡板与地面垂直,其 ...

  9. linux mysql 自动加斜杠_【实战演练】Linux操作系统19-Mysql主主复制加Keepalived高可用...

    理论部分,在之前的文章已经说明过了,详见: 繁星亮与鲍包包:[理论研究]业务系统高可用及负载均衡​zhuanlan.zhihu.com 上一篇已经讲述对2台Mysql服务器做主主复制,实现Mysql数 ...

最新文章

  1. logstash创建不了索引_「技术选型」Elasticsearch vs. Solr-选择您的开源搜索引擎
  2. (三十一)java版spring cloud+spring boot+redis多租户社交电子商务平台-spring-cloud-config...
  3. 如何对接oracle 建立pdb
  4. 第二章 数据的表示和运算 2.1.4 奇偶校验 [计算机组成原理笔记]
  5. linux汇编字符长怎么看,linux – 在内联GNU汇编程序中获取字符串长...
  6. mysql redis教程_MySQL redis学习与应用
  7. group by后可以join吗_去韩国留学毕业后可以留在韩国吗
  8. Oracle管理监控之sql developer配置与简单使用
  9. 编译原理三大经典书籍
  10. GRE over IPSec 主备双链路冗余配置
  11. Windows XP支持的最大内存是多少?
  12. 【P44】DC-DC隔离模块,解决蓝牙共地干扰问题
  13. Matlab yalmip 符号变量syms和sdpvar的替换
  14. mysql注入单引号被转义_插入MySQL时转义PHP中的单引号[重复]
  15. 一本通题解——1251:仙岛求药
  16. 笃行不怠勾勒人才图,望城区人才工作为高质量发展增添强劲动力
  17. 怎么修改计算机密码界面的背景,怎么修改Win7登录界面背景图片(欢迎界面背景图片)?...
  18. anemometer mysql5.6_slowlog分析anemometer平台搭建
  19. 记一次EFCore类型转换错误及解决方案
  20. 简析客户流失的原因及解决办法

热门文章

  1. VBKiller使用说明
  2. 【elasticsearch系列】安装elasticsearch-head插件
  3. 基于MHA+semi sync实现mysql数据库的高可用
  4. 算法学习之路|蒜头君的新游戏1
  5. Java_Date_01_判断两个时间相差的天数
  6. 厦门信息集团与EMC战略合作共建智慧厦门
  7. 什么是实践中真正在用的数据科学系统?
  8. mysql limit函数
  9. 后续:为LAMP添加XCache加速。
  10. Developer Express右键菜单显示汉化