站长家园(原代码之家)(www.adminjie.com)网站源码,微信源码,游戏源码,商业源码分享平台。
当前位置:网站首页 技术文章 网络编程 正文

怎样理解ThinkPHP的Loader自动加载

时间:2021-12-23 [网络编程]作者:fabuyuan 浏览:10 次

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

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

1-1 学习目标

  • 类的自动加载

  • 类自动加载的俩种方式

  • spl_autoload_register必须会使用

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

1-2 Composer加载

怎样理解ThinkPHP的Loader自动加载  2

在这里插入图片描述

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

怎样理解ThinkPHP的Loader自动加载  2

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

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

怎样理解ThinkPHP的Loader自动加载  2

在这里插入图片描述

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

  • 判断composer是否为目录

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

  • 引入autoload_static.php文件

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

  • 获取最后一个类ComposerStaticInit30742487e00917c888d89ba216f165b9

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

怎样理解ThinkPHP的Loader自动加载  2

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

怎样理解ThinkPHP的Loader自动加载  2

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

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

怎样理解ThinkPHP的Loader自动加载  2

1-3 注册命名空间

文件还是thinkphp\library\think\Loader.php的register方法

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

怎样理解ThinkPHP的Loader自动加载  2在addNamespace方法中,添加了Psr4空间

怎样理解ThinkPHP的Loader自动加载  2

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

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

怎样理解ThinkPHP的Loader自动加载  2

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

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

怎样理解ThinkPHP的Loader自动加载  2

1-4 Psr4是什么玩意

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

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

一个完整的类需要一下结构\<命名空间>(\<子命名空间>)*\<类名>

以下规范来源于PHP文档

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

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

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

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

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

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

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

怎样理解ThinkPHP的Loader自动加载  2

1-5 加载类库映射文件

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

怎样理解ThinkPHP的Loader自动加载  2

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

怎样理解ThinkPHP的Loader自动加载  2

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

怎样理解ThinkPHP的Loader自动加载  2

1-6 自动加载extend目录

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

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

怎样理解ThinkPHP的Loader自动加载  2

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

怎样理解ThinkPHP的Loader自动加载  2

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

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

怎样理解ThinkPHP的Loader自动加载  2

二、简说类的加载过程

怎样理解ThinkPHP的Loader自动加载  2

在这里插入图片描述

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

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

怎样理解ThinkPHP的Loader自动加载  2

经过断点第一个未加载的类就是think\Error

怎样理解ThinkPHP的Loader自动加载  2

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

怎样理解ThinkPHP的Loader自动加载  2

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

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

怎样理解ThinkPHP的Loader自动加载  2

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

怎样理解ThinkPHP的Loader自动加载  2

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

怎样理解ThinkPHP的Loader自动加载  2

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

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

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

怎样理解ThinkPHP的Loader自动加载  2

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

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

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

这时代码肯定不会走classMap

怎样理解ThinkPHP的Loader自动加载  2

先获取think\Error文件

怎样理解ThinkPHP的Loader自动加载  2

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

怎样理解ThinkPHP的Loader自动加载  2

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

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

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

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

先创建一个文件夹kaka

怎样理解ThinkPHP的Loader自动加载  2

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

怎样理解ThinkPHP的Loader自动加载  2

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

怎样理解ThinkPHP的Loader自动加载  2

在这里插入图片描述

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

怎样理解ThinkPHP的Loader自动加载  2

在这里插入图片描述

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

怎样理解ThinkPHP的Loader自动加载  2

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

怎样理解ThinkPHP的Loader自动加载  2

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

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

怎样理解ThinkPHP的Loader自动加载  2

在这里插入图片描述

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

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

怎样理解ThinkPHP的Loader自动加载  2

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

怎样理解ThinkPHP的Loader自动加载  2

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

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

怎样理解ThinkPHP的Loader自动加载  2

怎样理解ThinkPHP的Loader自动加载  2

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

怎样理解ThinkPHP的Loader自动加载  2

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

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

(推荐学习:thinkphp5)

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

本文标签:  thinkphp

转载请注明来源:怎样理解ThinkPHP的Loader自动加载

本文永久链接地址:https://www.adminjie.com/post/6752.html

免责声明:
本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

附:
二○○二年一月一日《计算机软件保护条例》第十七条规定:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬!鉴于此,也希望大家按此说明研究软件!

版权声明:
一、本站致力于为软件爱好者提供国内外软件开发技术和软件共享,着力为用户提供优资资源。
二、本站提供的部分源码下载文件为网络共享资源,请于下载后的24小时内删除。如需体验更多乐趣,还请支持正版。
三、我站提供用户下载的所有内容均转自互联网。如有内容侵犯您的版权或其他利益的,若有侵犯你的权益请:提交版权证明文件到邮箱 2225329873#qq.com(#换为@) 站长会进行审查之后,情况属实的会在三个工作日内为您删除。

  • 站长家园(原代码之家)会员升级
  • 最新文章
    • 空格键的功能有哪些

      空格键的功能有哪些

      空格键的功能:1、添加空格;2、网页翻页;3、播放器的暂停或播放;4、在游戏中,用于跳过动画、跳跃、还原画面、攻击或暂停等;5、和Ctrl键一起使用,用于切换中...

    • 怎样修改oracle的连接数

      怎样修改oracle的连接数

      方法:1、利用“altersystemsetprocesses=修改连接数scope=spfile”语句修改数据库允许的最大连接数;2、修改之后...

    • 你知道Golang怎么封装PHP常用函数吗!go-to-php

      你知道Golang怎么封装PHP常用函数吗!go-to-php

      本文由golang教程栏目给大家介绍关于Golang怎么实现PHP常用函数,希望对需要的朋友有所帮助!Golang实现PHP常用函数go-to-php用Gola...

    • oracle数据修改语句是什么

      oracle数据修改语句是什么

      在oracle中,数据修改语句是update语句,该语句的作用就是修改表中指定的数据,语法为“UPDATE表名称SET列名称=新值WHERE条件”...

    • HTML中哪种标签有边框

      HTML中哪种标签有边框

      HTML中有边框的标签:1、input标签,用于规定用户可以在其中输入数据的输入字段;2、hr标签,用于插入一条水平线;3、textarea标签,用于定义一个多...

    热门文章