想了很久终于要开始系列文章的编写了,期望是写出提升和面试都可以搞定的系列文章。 当你看到本文时,如果你发现咔咔没有编写到的面试热点问题或者技术难点,期待评论区指出,一起完善。
?目前在整理PHP进阶路线图,如有好的建议咔咔会第一时间进行收录。
从上图咔咔给的解析图,在base.php中首先加载了loader类,接着调用了register这个方法。
thinkphplibrary hinkLoader.php有一个register的方法,在这个方法里边,我们先学习第一个知识点spl_autoload_register()聊聊spl_autoload_register前世今生和简单使用,直接点击即可查看。
紧接着就是项目的根路径和composer的路径。
从这里开始就是在加载composer文件,过程也是很简单
self::${$attr} = $composerClass::${$attr};,这里的$attr就是'prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files'这些数据,外层在加一个$符号。
从而在ComposerStaticInit30742487e00917c888dba216f165b9这个类中直接获取对应的属性值,也就是上图的俩个属性值。
文件还是thinkphplibrary hinkLoader.php的register方法
在这里注册了俩个命令空间,分别为think和traits。然后会进入到addNamespace这个方法中addNamespace方法中,添加了Psr4空间
ComposerStaticInit1e269472f484e157e90227b420ffca7a类的$prefixLengthsPsr4和$prefixDirsPsr4这俩个属性中
traits也是一样的注册方式。
截止到这里命名空间就注册完成了,接下来研究一下psr4命名空间是个什么东东。
psr是简单的理解就是文件路径、自动加载对应类的相关规范、目前TP5.1使用的是psr4规范
此处的类是指class、接口、超类结构
一个完整的类需要一下结构<命名空间>(<子命名空间>)*<类名>
以下规范来源于PHP文档
完整的类名必须要有一个顶级命名空间,被称为 "vendor namespace";
完整的类名可以有一个或多个子命名空间;
完整的类名必须有一个最终的类名;
完整的类名中任意一部分中的下滑线都是没有特殊含义的;
完整的类名可以由任意大小写字母组成;
所有类名都必须是大小写敏感的。
以下是官方给的一个例子,这个psr规范能理解就尽量去理解它
到这里,肯定会有一个疑问,这里怎么没有classmap.php这个文件。php think optimize:autoload把文件弄出来addClassMap这个方法,在这个方法中,只是把classmap.php这个文件的数据赋值给$classMap 而已,没有什么其它的用法
extend这个目录用过TP框架的都多少用过的,在这个目录里边可以存放一下自定义的类库文件。
根据下图可以看到就是使用addAutoLoadDir这个方法进行加载的
$fallbackDirsPsr4这个属性。
Loader::register();这部分就结束了,接着我们深入的看一下内部实现和实践案例。
在以上阅读源码中有四个属性,简单的整理一下
在刚刚开始解析这里的源码时就有一个函数spl_autoload_register
当需要使用的类没有被引入时,这个函数会在PHP报错前被触发,未定义的类名会被当作参数传入这里会直接去执行think\Loader::autoload这个方法
thinkphp/base.php看一下,当自动加载完执行完成后第一个执行的类就是Error
当使用的类没有被引入时会把这个类当做参数传到thinkphp/library/think/Loader.php的autoload方法中。
autoload的file变量后,把win环境的大小写给判断了一次。
然后直接使用include引入文件即可,直到返回。
直到这里就是一次完整的类的自动加载解析。
$classMap这个属性,这个属性是基于文件classmap.php来到,这个文件的生成也是需要执行命令php think optimize:autoload生成的。
当没有生成这个文件时程序是如何执行的呢!
之前的所有流程都是一样的,只有在findFile这里不一样,接下来进行简单的梳理一下。
这时代码肯定不会走classMap
D:phpstudy_proWWWThinkPHPSourceCodeAnalysis hinkphplibrary hinkError.php这个文件。
这里的代码需要好好的阅读一下。
类的自动加载到这里就是完全结束了。
先创建一个文件夹kaka
这个时候就提现到源码的重要性了,还记得在自动加载的register函数中,加载过extend目录
这时在加一个kaka这个目录,直接进行访问一下
在之前聊注册自动加载类库目录只是说明了一下只是把路径存到了$fallbackDirsPsr4属性,没有细细说,接下来就是说明这些了。
阅读源码只能是实现那然后查看那
只要是定义的类都会进去到autoload进行自动加载
同样也会进入到findFile这个方法
$fallbackDirsPsr4属性的。
很清楚地可以看到testKaka这个类
$fallbackDirsPsr4属性里边返回的file
__include_file来直接includeD:phpstudy_proWWWThinkPHPSourceCodeAnalysiskaka estKaka.php我们定义的文件。
以上的这个自定义文件如何实现类的自动加载,并且也就是extend的加载方式
关于类自动加载的所有流程就完成了,如有错误之处可以在评论区哦!
?坚持学习、坚持写博、坚持分享是咔咔从业以来一直所秉持的信念。希望在偌大互联网中咔咔的文章能带给你一丝丝帮助。我是咔咔,下期见。
?