thinkphp 框架自动加载原理_thinkphp5 源码分析之自动加载器

最近做项目用到了Thinkphp5 感觉很多地方还不是特别清晰,在此阅读源码做个记录;有分析的不对的地方请大家批评指正

自动加载器

1.为什么框架需要一个自动加载器?

当然有很多不同的解释,不过在我看来,最主要的作用还是实现类的懒加载,即当创建类时才为程序加载对应的类。

2.怎么应用自动类加载器加载创建的自定义类

在extend 目录下创建自定义类,注意类名和文件名要保持一致,最后在使用的地方直接引用就可以了

如果需要使用命名空间,需要特殊注意,命名空间必须 以文件夹的形式存在

587430a7357ca3af98c08cfd5d6574b3.png

调用必须带上命名空间的前缀~~~~

fe10392e3a0fbe9a5e0f304989e325f1.png

3.Thinkphp5 如何实现自动加载器

(1)index.php中引入启动strat.php

e893282d91a3ffdbec648a880be70c39.png

(2)在strat.php中执行应用之前,调用base.php

base.php 会定义部分常量,然后执行注册自动加载类

4ae569a1023b0985cead212798e8b2b4.png

composer自动加载,由于项目暂时用不到,就先不分析了

spl_autoload_register() 方法注册类加载方法,当执行中遇到未知类会自动调用Loader::autoload方法(注意这里autoload方法必须是静态的)这里的注册过程和Loader::autoload中检索类过程是一一对应的,所以分析下面三个注册和查找过程:

276ff5458e3430062ea5ae2bb985433d.png

这里其实本质上就是为Loader这个静态类,注册命名空间的路径,本质上来说就是key==》value的值对应,只不过为了优化查找效率将值分别存储,一组用来存储所有的命名空间Key 和vlaue的对应如下图 变量名为$prefixDirsPsr4,

e16a958175ddddb8bf72d00e01747cf7.png

另外一组类似与字典,key为所有命名空间的首字母和对应的值,变量名为$prefixLengthsPsr4

793a88a1f08d1211274a359ae2db890c.png

有了上面的分析注册命名空间的任务就很明确了

1 注册空间名称和地址

2 并且字典成员变量添加注册

源码如下:

$prefix 空间前缀

$paths 路径

$prepend 预先设置的优先级更高

e707970ad14a6e19b9663069c1317749.png

加载类库映射文件

这里直接是key ==》 的存储

e79f4d90645a692657856f018e8af85e.png

自动加载 extend 目录

89d3038837dda68a000a95a0f5ba7441.png

3.查找过程

dd2f46079293b1592f1dee62ff6b1b73.png

f09d66f737aa4e19a371bdb8aff96bde.png

fdfdf3c8fb3587ad43862a39783a912c.png

最后在添加一点PRS-0; 和PRS-4的只是

5 PRS-0 PRS-4区别

PRS-0

e23c3b5b520a43b6776940a716515198.png

PRS-4

adb7adb3ddb25c9c7b90367302194397.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值