Tp5框架源码分析第一步---------类的自动加载初始化

自动加载

在每个框架都有类的自动加载机制,php引入文件使用require和include方法,当我们写一个公共类库,例如model类,当我们使用model类里的方法的时候,直接使用require或者include就可以。但是当类似公共文件非常多的时候,每次都使用require和include引入,非常麻烦,不利于管理。
php有种机制叫做类的自动加载机制,tp框架通过spl_autoload_register()来完成类的自动加载。自动加载是框架的灵魂。

入口文件

tp入口文件是public目录下的index.php文件。在index.php中,先通过require加载thinkphp目录下的start.php文件,在start.php中再加载同目录下的base.php文件。
index.php文件
Tp5框架源码分析第一步---------类的自动加载初始化_第1张图片
start.php文件
Tp5框架源码分析第一步---------类的自动加载初始化_第2张图片
在base.php中,会加载Loader.php文件,loader.php是tp5自动加载的类库文件,也就是tp5的灵魂。Loader.php文件在thinkphp/libarary/think目录下。Loader.php是自动加载的,tp5封装的底层基础类库。
Tp5框架源码分析第一步---------类的自动加载初始化_第3张图片

spl_auto_autoload_register()初了解

spl_auto_autoload_register()是进行文件自动加载的方法。现在我们创建一个和public同级的目录excise目录,然后创建一个test.php文件,在里面实例化一个Tests类,但是这个Tests类是不存在的,执行之后肯定会报错。接下来我们在excise目录创建一个Tests类,在类里面写一个say方法。但是在这种情况下也是会报错的,这个时候需要进行自动加载,用spl_auto_autoload_register()进行自动加载。
Tests.php
Tp5框架源码分析第一步---------类的自动加载初始化_第4张图片

test.php
Tp5框架源码分析第一步---------类的自动加载初始化_第5张图片
这样使用之后就不会报错了!
执行结果:
image.png

自动加载Loder深度剖析

在base.php文件中,加载完Loader.php文件后,会进行注册自动加载和注册错误和异常处理机制以及配置文件。
Tp5框架源码分析第一步---------类的自动加载初始化_第6张图片
Loader.php register方法
Tp5框架源码分析第一步---------类的自动加载初始化_第7张图片
A:使用了一个类似于三元运算符的方式,如果在base.php的注册自动加载register方法中传入有效参数的话,就会执行传入的参数,如果不传入参数,就会执行Loader.php本类的方法autoload。如果调用不存在类的话,也会执行autoload方法。
B:判断vendor目录下的composer是否是目录。
C:判断php版本是否大于5.6.0。
D:判断vendor/composer/autoload_static.php是否是文件。
如果上面的判断执行通过,加载autoload_static.php文件。
1:返回已定义类的名字所组成的数组。
2:删除类数组中的最后一个元素。
autoload_static.php
Tp5框架源码分析第一步---------类的自动加载初始化_第8张图片
$prefixLengthsPsr4是定义的一个参数,其中把t和a是key,value是一个命名空间,把命名空间的首字母作为key,后面是数字代表命名空间的字符长度。其中两个斜线是做了一个转义,相当于一个斜线。
Tp5框架源码分析第一步---------类的自动加载初始化_第9张图片
其中的红线可以忽略,代码是没问题的。$prefixDirsPsr4这个参数是把每一个命名空间对应的目录罗列出来。比如think\对应的就是thinkphp/library/think目录,app\对应的就是application目录。psr0和psr4是php的一种规范,当用composer下载的插件,会自动通过psr系列规范把对应的命名空间加到以上两个参数中。
接下来是注册命名空间定义,此时把think,behavior,traints放到prefixLengthsPsr4,prefixDirsPsr4,fallbackDirsPsr4中去
Tp5框架源码分析第一步---------类的自动加载初始化_第10张图片
addNamespace方法:
Tp5框架源码分析第一步---------类的自动加载初始化_第11张图片
传入的$namespace参数是如下图的一个数组
image.png
如果namespace是个数组,就通过foreach之后调用addPsr4方法;如果不是数组,就直接调用addPsr4方法。
addPsr4():
Tp5框架源码分析第一步---------类的自动加载初始化_第12张图片
通过上面的分析,我们能够知道self::$prefixDirsPsr4[$prefix]是不存在的,所以走中间的逻辑。
接下来进行加载类库映射文件
Tp5框架源码分析第一步---------类的自动加载初始化_第13张图片
在项目目录文件夹中执行php think optimize:autoload命令,生成classmap.php文件。它是一个类的映射关系文件。
addClassMap()方法
Tp5框架源码分析第一步---------类的自动加载初始化_第14张图片
判断$class是否是数组,如果是数组,就把$class合并到$classMap中去,如果不是数组,就把$class添加到$classMap中。
接着加载extend目录,把extend的路径加载到$fallbackDirsPsr4[]中去。

以上就是tp5自动加载的过程,第一次写博客,不知道写的怎么样,欢迎大家来评论找不足

你可能感兴趣的:(php后端)