怎样理解ThinkPHP的Loader自动加载

本篇文章给大家带来了thinkphp中loader自动加载的相关知识,主要包含了composer加载的相关知识,希望对大家有帮助!

怎样理解ThinkPHP的Loader自动加载一、自动加载loader源码分析

1-1 学习目标

类的自动加载

类自动加载的俩种方式

立即学习“PHP免费学习笔记(深入)”;

spl_autoload_register必须会使用

实现自定义文件的类的自动加载

1-2 Composer加载

10.png

在这里插入图片描述

在base.php中首先加载了loader类,接着调用了register这个方法。

11.png

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

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

12.png

在这里插入图片描述

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

判断composer是否为目录

判断路径下面的autoload_static.php是否为文件

引入autoload_static.php文件

返回所有已经声明的所有类  数组返回

获取最后一个类ComposerStaticInit30742487e00917c888d89ba216f165b9

判断ComposerStaticInit30742487e00917c888d89ba216f165b9中是否存在数组中的数据

13.png

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

14.png

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

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

15.png

1-3 注册命名空间

文件还是thinkphplibraryhinkLoader.php的register方法

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

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

17.png

接着来到addPsr4这个方法,会把这俩个命名空间都注册到

ComposerStaticInit1e269472f484e157e90227b420ffca7a类的$prefixLengthsPsr4和$prefixDirsPsr4这俩个属性中

18.png

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

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

19.png

1-4 Psr4是什么玩意

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

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

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

以下规范来源于PHP文档

完整的类名必须要有一个顶级命名空间,被称为 “vendor namespace”;

完整的类名可以有一个或多个子命名空间;

完整的类名必须有一个最终的类名;

完整的类名中任意一部分中的下滑线都是没有特殊含义的;

完整的类名可以由任意大小写字母组成;

所有类名都必须是大小写敏感的。

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

20.png

1-5 加载类库映射文件

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

21.png

不急不慌,先执行php think optimize:autoload把文件弄出来

22.png

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

23.png

1-6 自动加载extend目录

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

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

24.png

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

25.png

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

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

壁纸样机神器 壁纸样机神器

免费壁纸样机生成

壁纸样机神器 0 查看详情 壁纸样机神器

26.png

二、简说类的加载过程

27..png

在这里插入图片描述

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

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

28.png

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

29.png

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

30.png

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

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

31.png

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

32.png

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

33.png

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

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

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

34.png

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

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

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

这时代码肯定不会走classMap

35.png

先获取thinkError文件

36.png

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

37.png

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

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

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

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

先创建一个文件夹kaka

38.png

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

39.png

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

40.png

在这里插入图片描述

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

41.png

在这里插入图片描述

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

42.png

没毛病,直接就出来了。一切OK在这里在聊一下关于extent的加载方式

43.png

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

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

44.png

在这里插入图片描述

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

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

45.png

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

46.png

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

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

47.png

48.png

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

49.png

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

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

(推荐学习:thinkphp5)

以上就是怎样理解ThinkPHP的Loader自动加载的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/343577.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
win11右键刷新反应慢怎么办_win11右键菜单卡顿延迟解决方法
上一篇 2026年11月9日 17:08:37
c语言精通了能干什么?
下一篇 2025年12月17日 09:00:54

相关推荐

  • thinkphp里面的c方法怎么用

    thinkphp里面的c方法怎么用thinkphp里面的c方法怎么用thinkphp里面的c方法怎么用thinkphp里面的c方法怎么用

    thinkphp里面的c方法是用于设置、获取,以及保存配置参数的方法,其使用语法如“C(‘DB_NAME’,’thinkphp’);”,表示设置DB_NAME配置参数的值为thinkphp。 本文操作环境:Windows7系统、thinkphp v5.…

    2026年11月9日 • 用户投稿
    000
  • thinkphp不解析u怎么办

    thinkphp不解析u怎么办thinkphp不解析u怎么办thinkphp不解析u怎么办thinkphp不解析u怎么办

    thinkphp不解析u是因为模板引擎只会解析一次,并且不在模版文件中的标签用法是不会解析的,其解决办法就是在放数据库中之前生成一次,然后存入即可。 本文操作环境:Windows7系统、thinkphp v5.1版、Dell G3电脑。 thinkphp不解析u怎么办? Thinkphp的U方法不能…

    2026年11月9日 • 用户投稿
    100
  • thinkphp是一个开发工具吗

    thinkphp是一个开发工具吗thinkphp是一个开发工具吗thinkphp是一个开发工具吗thinkphp是一个开发工具吗

    thinkphp不是一个开发工具,而是一个为了简化企业级应用开发和敏捷WEB应用开发而诞生的开源轻量级PHP框架;该框架可以支持windows/Unix/Linux等服务器环境,并且支持MySql、PgSQL、Sqlite多种数据库。 本文操作环境:Windows7系统、thinkphp v5.1版…

    2026年11月9日 • 用户投稿
    400
  • 如何解决thinkphp汉字乱码问题

    如何解决thinkphp汉字乱码问题如何解决thinkphp汉字乱码问题如何解决thinkphp汉字乱码问题如何解决thinkphp汉字乱码问题

    thinkphp汉字乱码的解决办法:1、找到并打开thinkphp的入口文件;2、在该文件中添加“header(‘Content-Type:text/html; charset=utf-8’);”即可。 本文操作环境:Windows7系统、thinkphp v5.1版、Del…

    2026年11月9日 • 用户投稿
    000
  • 这4种TP url访问方式你知道吗?

    下面thinkphp框架教程栏目将给大家介绍四种thinkphp url访问方式,希望对需要的朋友有所帮助! 本文实例分析了thinkphp的四种url访问方式。分享给大家供大家参考。具体分析如下: 一、什么是MVC   thinkphp的MVC模式非常灵活,即使只有三个中和一个也可以运行。 M -…

    2026年11月9日
    000
  • 记一个ThinkPHP框架的渗透实战

    记一个ThinkPHP框架的渗透实战记一个ThinkPHP框架的渗透实战记一个ThinkPHP框架的渗透实战记一个ThinkPHP框架的渗透实战

    下面thinkphp框架教程栏目将给大家分享一个thinkphp框架渗透实战,希望对需要的朋友有所帮助! 信息收集 找到一个网站 http://x.x.x.x/ 下面开始对他进行渗透 首先使用nmap对受害服务器开放的端口扫描探测端口 可以看到开放的端口如下 立即学习“PHP免费学习笔记(深入)”;…

    2026年11月9日 • 用户投稿
    000
  • thinkphp5怎么判断表是否存在

    thinkphp5怎么判断表是否存在thinkphp5怎么判断表是否存在thinkphp5怎么判断表是否存在thinkphp5怎么判断表是否存在

    方法:1、用“$a=M()->query(‘SHOW TABLES LIKE”表名”‘);if($a){存在}else{表不存在}”判断;2、用“$a=M(表名);if($a->getDbError()){表不存在}else{存在}”判断。…

    2026年11月9日 • 用户投稿
    400
  • thinkphp字符串加密方法是什么

    thinkphp字符串加密方法是什么thinkphp字符串加密方法是什么thinkphp字符串加密方法是什么thinkphp字符串加密方法是什么

    方法:1、利用assign()函数将字符串传递给html页面,语法为“$this->assign(“str”,字符串)”;2、利用“$this->display()”调用模板;3、利用md5函数加密并输出,语法为“{$str|md5}”。 本文操作环境:Windo…

    2026年11月9日 • 用户投稿
    300
  • thinkphp怎么判断变量是否为数字

    thinkphp怎么判断变量是否为数字thinkphp怎么判断变量是否为数字thinkphp怎么判断变量是否为数字thinkphp怎么判断变量是否为数字

    方法:1、用“protected 变量=array(array(‘your_variable’,’number’,’变量为数字’),)”判断;2、用“is_numeric(变量);preg_match(‘/^d+$/…

    2026年11月9日 • 用户投稿
    700
  • thinkcmf和thinkphp有什么区别

    thinkcmf和thinkphp有什么区别thinkcmf和thinkphp有什么区别thinkcmf和thinkphp有什么区别thinkcmf和thinkphp有什么区别

    区别:1、thinkphp是基于PHP的一个MVC的开源框架,而thinkcmf是基于ThinkPHP和MYSQL二次封装的中文内容管理框架;2、thinkphp使用php语言封装一些类,而thinkcmf是基于AFN封装的网络请求框架。 本文操作环境:Windows10系统、ThinkPHP5 版…

    2026年11月9日 • 用户投稿
    1000
  • dedecms和thinkphp有什么区别

    dedecms和thinkphp有什么区别dedecms和thinkphp有什么区别dedecms和thinkphp有什么区别dedecms和thinkphp有什么区别

    区别:1、dedecms是一个PHP开源网站内容管理系统,而thinkphp是基于PHP的一个MVC的开源框架;2、thinkphp是在编写网站程序时简化编程的,而dedecms网站内容管理程序是用来做网站用的。 本文操作环境:Windows10系统、ThinkPHP5 版、Dell G3电脑。 d…

    2026年11月9日 • 用户投稿
    000
  • smarty和thinkphp的区别是什么

    smarty和thinkphp的区别是什么smarty和thinkphp的区别是什么smarty和thinkphp的区别是什么smarty和thinkphp的区别是什么

    smarty和thinkphp的区别为:smarty是使用PHP写的模板引擎,用于分离PHP和HTML代码;而thinkphp是一个开源的轻量级PHP框架,定义了一些规则并封装了一些操作,用于快速开发提高效率。 本文操作环境:Windows10系统、ThinkPHP5版、Dell G3电脑。 sma…

    2026年11月9日 • 用户投稿
    100
  • thinkphp中5和6有什么区别

    thinkphp中5和6有什么区别thinkphp中5和6有什么区别thinkphp中5和6有什么区别thinkphp中5和6有什么区别

    区别:1、thinkphp5默认多应用,而thinkphp6默认单应用;2、thinkphp5默认加载官方模板引擎,而thinkphp6默认不加载官方模板引擎;3、thinkphp5默认启用session,而thinkphp6默认不启用。 本文操作环境:Windows10系统、ThinkPHP5版、…

    2026年11月9日 • 用户投稿
    100
  • thinkphp5中save方法怎么用

    thinkphp5中save方法怎么用thinkphp5中save方法怎么用thinkphp5中save方法怎么用thinkphp5中save方法怎么用

    在thinkphp5中,save()方法用于向指定数据表中添加一条记录,该方法每次仅能向表中添加一条新记录,添加多条可重复执行,语法为“模型对象 -> save(数组)”或“模型对象 -> data(数组) -> save();”。 本文操作环境:Windows10系统、Think…

    2026年11月9日 • 用户投稿
    500
  • thinkphp3.2怎么设置时区

    thinkphp3.2怎么设置时区thinkphp3.2怎么设置时区thinkphp3.2怎么设置时区thinkphp3.2怎么设置时区

    设置时区的方法:1、在“php.ini”配置文件中设置时区,更改“date.timezone”项的内容并将项目前的“;”去掉即可;2、利用“date_default_timezone_set()”函数设置时区,在参数内规定指定的时区即可。 本文操作环境:Windows10系统、ThinkPHP3.2…

    2026年11月9日 • 用户投稿
    100
  • thinkphp是cms么

    thinkphp是cms么thinkphp是cms么thinkphp是cms么thinkphp是cms么

    thinkphp不是cms。thinkphp和cms是不一样的概念,thinkphp是一种PHP程序开发使用的框架,用于简化企业级应用开发和敏捷WEB应用开发;而cms指的是内容管理系统,是一种PHP成品程序。 本教程操作环境:Windows7系统、thinkphp v5.1版、Dell G3电脑。…

    2026年11月9日 • 用户投稿
    000
  • thinkphp中I方法怎么用

    thinkphp中I方法怎么用thinkphp中I方法怎么用thinkphp中I方法怎么用thinkphp中I方法怎么用

    在thinkphp中,I方法的命名来自于“Input”,用于更加安全和方便的获取系统输入变量,语法为“I(‘变量类型.变量名’,[‘默认值’],[‘过滤方法’])”;其中变量类型不区分大小写,而变量名严格区分大小写。 本文操作环…

    2026年11月9日 • 用户投稿
    100
  • thinkphp中的L方法怎么用

    thinkphp中的L方法怎么用thinkphp中的L方法怎么用thinkphp中的L方法怎么用thinkphp中的L方法怎么用

    在thinkphp中,L方法用于启用多语言的情况下,设置和获取当前的语言定义,设置语言定义的语法为“L(‘LANG_VAR’,’语言定义’);”,获取语言定义的语法为“$langVar = L(‘LANG_VAR’);”。 本文…

    2026年11月9日 • 用户投稿
    000
  • thinkphp中R方法怎么用

    thinkphp中R方法怎么用thinkphp中R方法怎么用thinkphp中R方法怎么用thinkphp中R方法怎么用

    在thinkphp中,R方法用于调用某个控制器的操作方法,是A方法的进一步增强和补充,R方法的调用格式为“R(‘[项目://][分组/]模块/操作’,’参数’,’控制器层名称’)”。 本文操作环境:Windows10系统、Thi…

    2026年11月9日 • 用户投稿
    100
  • thinkphp的page是什么方法

    thinkphp的page是什么方法thinkphp的page是什么方法thinkphp的page是什么方法thinkphp的page是什么方法

    在thinkphp中,page方法是模型连贯操作方法之一,是为分页查询而诞生的人性化操作方法,使用该方法不需要计算每个分页数据的起始位置,该方法的内部会自动计算,语法为“$Article->page(1,10)->select();”。 本文操作环境:Windows10系统、ThinkP…

    2026年11月9日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信