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文件
image.png
start.php文件
image.png
在base.php中,会加载Loader.php文件,loader.php是tp5自动加载的类库文件,也就是tp5的灵魂。Loader.php文件在thinkphp/libarary/think目录下。Loader.php是自动加载的,tp5封装的底层基础类库。
image.png

spl_auto_autoload_register()初了解

spl_auto_autoload_register()是进行文件自动加载的方法。现在我们创建一个和public同级的目录excise目录,然后创建一个test.php文件,在里面实例化一个Tests类,但是这个Tests类是不存在的,执行之后肯定会报错。接下来我们在excise目录创建一个Tests类,在类里面写一个say方法。但是在这种情况下也是会报错的,这个时候需要进行自动加载,用spl_auto_autoload_register()进行自动加载。
Tests.php
image.png

test.php
image.png
这样使用之后就不会报错了!
执行结果:
image.png

【属性深度剖析】自动加载Loder深度剖析

在base.php文件中,加载完Loader.php文件后,会进行注册自动加载和注册错误和异常处理机制以及配置文件。
image.png
Loader.php register方法
image.png
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,prefixLengthsPsr4属性
image.png
$prefixLengthsPsr4是定义的一个参数,其中把t和a是key,value是一个命名空间,把命名空间的首字母作为key,后面是数字代表命名空间的字符长度。其中两个斜线是做了一个转义,相当于一个斜线。~~~~prefixDirsPsr4属性
image.png
其中的红线可以忽略,代码是没问题的。$prefixDirsPsr4这个参数是把每一个命名空间对应的目录罗列出来。比如think\对应的就是thinkphp/library/think目录,app\对应的就是application目录。psr0和psr4是php的一种规范,当用composer下载的插件,会自动通过psr系列规范把对应的命名空间加到以上两个参数中。
接下来是注册命名空间定义,此时把think,behavior,traints放到prefixLengthsPsr4,prefixDirsPsr4,fallbackDirsPsr4中去
image.png
addNamespace方法:
image.png
传入的$namespace参数是如下图的一个数组,fallbackDirsPsr4属性:
image.png
如果namespace是个数组,就通过foreach之后调用addPsr4方法;如果不是数组,就直接调用addPsr4方法。
addPsr4():
image.png
通过上面的分析,我们能够知道self::$prefixDirsPsr4[$prefix]是不存在的,所以走中间的逻辑。
接下来进行加载类库映射文件
image.png
在项目目录文件夹中执行php think optimize:autoload命令,生成classmap.php文件。它是一个类的映射关系文件。
addClassMap()方法
image.png
判断$class是否是数组,如果是数组,就把$class合并到$classMap中去,如果不是数组,就把$class添加到$classMap中。
接着加载extend目录,把extend的路径加载到$fallbackDirsPsr4[]中去。

【类的别名设置】自动加载Loader深度分析

上面我们说到register()方法传参为空或者调用的类不存在的时候就会执行autoload方法。
autoload方法就是设置类的别名,下面我们对里面的逻辑进行逐步分析。
Tp5框架源码分析第一步---------类的自动加载初始化_第1张图片
A:$namesaceAlias参数是在Loder中定义的命名空间别名数组,首先判断$namespace是否是空
B:把$class的目录路径赋值给$namespace
C:判断$namespaceAlis[$namespace]是否为空
D:然后把$class的类名添加到$namespacaAlis[$namespace]后面,然后赋值给$original
E:判断$original的类是否存在
F:把$original起一个类的别名
操作之后就相当于App是think\App.php类的别名。
Tp5框架源码分析第一步---------类的自动加载初始化_第2张图片
这里是返回文件名,通过findFile函数来在classMap文件中查找是否存在这个文件,存在就返回
接下来进行下一步逻辑
Tp5框架源码分析第一步---------类的自动加载初始化_第3张图片
$logicalPathPsr4 是把$class加上.php然后赋值形成的,接着把$class的第一个元素的key赋值给$first。然后判断$prefisLengthsPsr4[$first]是否存在,如果存在进行foreach遍历,判断$class在$prefisLengthsPsr4[$first]中是否在第一个位置的key,接着遍历,判断$prefisLengthsPsr4[$first]返回的value是否是文件,是文件就返回。
Tp5框架源码分析第一步---------类的自动加载初始化_第4张图片
接着遍历$fallbackDirsPsr4,判断$logicalPathPsr4在$fallbackDirsPsr4是否是文件。

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

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