我是靠谱客的博主 怕孤独西牛,最近开发中收集的这篇文章主要介绍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

最后

以上就是怕孤独西牛为你收集整理的thinkphp 框架自动加载原理_thinkphp5 源码分析之自动加载器的全部内容,希望文章能够帮你解决thinkphp 框架自动加载原理_thinkphp5 源码分析之自动加载器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部