首页 » PHP教程 » phploader技巧_这下你应该理解ThinkPHP的Loader自动加载了

phploader技巧_这下你应该理解ThinkPHP的Loader自动加载了

访客 2024-11-27 0

扫一扫用手机浏览

文章目录 [+]

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

来到thinkphp\library\think\Loader.php有一个register的方法,在这个方法里边,我们先学习第一个知识点spl_autoload_register()聊聊spl_autoload_register前世今生和大略利用,直接点击即可查看。

phploader技巧_这下你应该理解ThinkPHP的Loader自动加载了

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

phploader技巧_这下你应该理解ThinkPHP的Loader自动加载了
(图片来自网络侵删)

从这里开始便是在加载composer文件,过程也是很大略

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

接着可以去vendor\composer\autoload_static.php文件中可以看到这俩个属性

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

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

1-3 注册命名空间

文件还是thinkphp\library\think\Loader.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报错前被触发,未定义的类名会被当作参数传入这里会直接去实行think\\Loader::autoload这个方法

经由断点第一个未加载的类便是think\Error

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

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

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

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

先从findFile这个方法走,把未由于的类传入这个方法中,在findFile这个方法中会直接从classMap这个属性中直接把think\Error这个类映射的文件直接返回出来

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

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

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

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

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

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

这时期码肯定不会走classMap

先获取think\Error文件

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

终极返回的结果也是D:\phpstudy_pro\WWW\ThinkPHPSourceCodeAnalysis\thinkphp\library\think\Error.php这个文件。

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

类的自动加载到这里便是完备结束了。

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

先创建一个文件夹kaka

这时在掌握器index中引入文件Kaka.php

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

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

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

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

在这里再聊一下关于extent的加载办法

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

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

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

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

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

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

很清楚地可以看到test\Kaka这个类

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

然后便是利用__include_file来直接includeD:\phpstudy_pro\WWW\ThinkPHPSourceCodeAnalysis\kaka\test\Kaka.php我们定义的文件。

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

四、总结

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

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

标签:

相关文章

介绍白点控制之路,从原理到方法

白点,作为生活中常见的现象,无处不在。对于如何控制白点,许多人却感到困惑。本文将从原理出发,探讨白点的控制方法,并结合实际案例,为...

PHP教程 2025-01-03 阅读1 评论0

介绍直播王者,如何开启你的电竞直播之旅

随着电竞产业的蓬勃发展,越来越多的年轻人投身于电竞直播行业。王者荣耀作为一款备受欢迎的MOBA手游,吸引了大量玩家和观众。如何开启...

PHP教程 2025-01-03 阅读1 评论0