想了很久终于要开始系列文章的编写了,期望是写出提升和面试都可以搞定的系列文章。
当你看到本文时,如果你发现咔咔没有编写到的面试热点问题或者技术难点,期待评论区指出,一起完善。 目前在整理PHP进阶路线图,如有好的建议咔咔会第一时间进行收录。 从上图咔咔给的解析图,在base.php中首先加载了loader类,接着调用了register这个方法。 紧接着就是项目的根路径和composer的路径。 从这里开始就是在加载composer文件,过程也是很简单 从而在 文件还是 在这里注册了俩个命令空间,分别为think和traits。然后会进入到addNamespace这个方法中 截止到这里命名空间就注册完成了,接下来研究一下psr4命名空间是个什么东东。 psr是简单的理解就是文件路径、自动加载对应类的相关规范、目前TP5.1使用的是psr4规范 此处的类是指class、接口、超类结构 一个完整的类需要一下结构 以下规范来源于PHP文档 完整的类名必须要有一个顶级命名空间,被称为 "vendor namespace"; 完整的类名可以有一个或多个子命名空间; 完整的类名必须有一个最终的类名; 完整的类名中任意一部分中的下滑线都是没有特殊含义的; 完整的类名可以由任意大小写字母组成; 所有类名都必须是大小写敏感的。 以下是官方给的一个例子,这个psr规范能理解就尽量去理解它 到这里,肯定会有一个疑问,这里怎么没有classmap.php这个文件。 extend这个目录用过TP框架的都多少用过的,在这个目录里边可以存放一下自定义的类库文件。 根据下图可以看到就是使用 在以上阅读源码中有四个属性,简单的整理一下 在刚刚开始解析这里的源码时就有一个函数 当需要使用的类没有被引入时,这个函数会在PHP报错前被触发,未定义的类名会被当作参数传入这里会直接去执行 当使用的类没有被引入时会把这个类当做参数传到 然后直接使用 直到这里就是一次完整的类的自动加载解析。 当没有生成这个文件时程序是如何执行的呢! 之前的所有流程都是一样的,只有在 这时代码肯定不会走classMap 这里的代码需要好好的阅读一下。 类的自动加载到这里就是完全结束了。 先创建一个文件夹kaka 这个时候就提现到源码的重要性了,还记得在自动加载的 这时在加一个kaka这个目录,直接进行访问一下 在之前聊注册自动加载类库目录只是说明了一下只是把路径存到了 阅读源码只能是实现那然后查看那 只要是定义的类都会进去到autoload进行自动加载 同样也会进入到 很清楚地可以看到 以上的这个自定义文件如何实现类的自动加载,并且也就是 关于类自动加载的所有流程就完成了,如有错误之处可以在评论区哦! 坚持学习、坚持写博、坚持分享是咔咔从业以来一直所秉持的信念。希望在偌大互联网中咔咔的文章能带给你一丝丝帮助。我是咔咔,下期见。
❝
前言
一、自动加载loader源码分析
1-1 学习目标
1-2 Composer加载

来到thinkphplibrary hinkLoader.php有一个register的方法,在这个方法里边,我们先学习第一个知识点spl_autoload_register()聊聊spl_autoload_register前世今生和简单使用,直接点击即可查看。
接着可以去vendorcomposerutoload_static.php文件中可以看到这俩个属性
这里有一段代码估计有一部分同学会在这里绕一下self::${$attr} = $composerClass::${$attr};,这里的$attr就是'prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files'这些数据,外层在加一个$符号。ComposerStaticInit30742487e00917c888d89ba216f165b9这个类中直接获取对应的属性值,也就是上图的俩个属性值。
1-3 注册命名空间
thinkphplibrary hinkLoader.php的register方法
在addNamespace方法中,添加了Psr4空间
接着来到addPsr4这个方法,会把这俩个命名空间都注册到ComposerStaticInit1e269472f484e157e90227b420ffca7a类的$prefixLengthsPsr4和$prefixDirsPsr4这俩个属性中
为了验证上面做一个断点调试,看到这些数据就应该清晰了,至于traits也是一样的注册方式。
1-4 Psr4是什么玩意
()*

1-5 加载类库映射文件
不急不慌,先执行php think optimize:autoload把文件弄出来
最终会走到addClassMap这个方法,在这个方法中,只是把classmap.php这个文件的数据赋值给$classMap 而已,没有什么其它的用法
1-6 自动加载extend目录
addAutoLoadDir这个方法进行加载的
在方法中也仅仅是把extend的路径赋值给了$fallbackDirsPsr4这个属性。
截止到这里Loader::register();这部分就结束了,接着我们深入的看一下内部实现和实践案例。
二、简说类的加载过程

spl_autoload_registerthink\Loader::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这里不一样,接下来进行简单的梳理一下。
先获取thinkError文件
然后经过Composer自动加载中的俩个属性进行获取命名空间,在把thinkError.php文件进行拼接
最终返回的结果也是D:phpstudy_proWWWThinkPHPSourceCodeAnalysis hinkphplibrary hinkError.php这个文件。
三、自定义文件如何实现类的自动加载
这时在控制器index中引入文件Kaka.php
直接进行访问,这时这个类肯定会报错,那么我们应该怎么操作一下,就可以直接访问呢!
register函数中,加载过extend目录
没毛病,直接就出来了。一切OK
在这里在聊一下关于extent的加载方式$fallbackDirsPsr4属性,没有细细说,接下来就是说明这些了。
findFile这个方法
在findFile这个方法中可以看到这段代码,这个属性是不是很熟悉,就是自动加载extend目录时添加到$fallbackDirsPsr4属性的。
当在findFile中打印参数class时看一下数据testKaka这个类
此时在打印一下这个$fallbackDirsPsr4属性里边返回的file
然后就是使用__include_file来直接includeD:phpstudy_proWWWThinkPHPSourceCodeAnalysiskaka estKaka.php我们定义的文件。extend的加载方式
四、总结
❝
0
0
相关文章
thinkphp如何配置伪静态隐藏index.php
thinkphp数据库迁移和数据填充怎么用
thinkphp查询作用域(scope)如何简化查询
thinkphp session无法保存或跨控制器失效怎么办
thinkphp如何防止SQL注入和XSS攻击
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
Composer是一个PHP的依赖管理工具,它可以帮助开发者在PHP项目中管理和安装依赖的库文件。Composer通过一个中央化的存储库来管理所有的依赖库文件,这个存储库包含了各种可用的依赖库的信息和版本信息。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
161
2023.12.25
对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
384
2024.04.10
thinkphp 是一款高性能的 php 框架,具备缓存机制、代码优化、并行处理和数据库优化等优势。官方性能测试显示,它每秒可处理超过 10,000 个请求,实际应用中被广泛用于京东商城、携程网等大型网站和企业系统。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
356
2024.04.10
scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
411
2023.10.18
500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
368
2023.10.25
硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。
1774
2023.10.19
PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
2340
2025.12.29
2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!
0
2026.03.04
热门下载
相关下载
精品课程
共12课时 | 0.7万人学习
共18课时 | 1.3万人学习
共11课时 | 0.7万人学习


