二、简说类的加载过程
在刚刚开始解析这里的源码时就有一个函数spl_autoload_register
当需要使用的类没有被引入时,这个函数会在PHP报错前被触发,未定义的类名会被当作参数传入这里会直接去执行think\\Loader::autoload这个方法
经过断点第一个未加载的类就是think\Error
为什么是think\Error呢!可以在回到thinkphp/base.php看一下,当自动加载完执行完成后第一个执行的类就是Error
可以简单的做个测试,将这Error改为Kaka,进行打印一下,这时的类就改变为Kaka。到这里大家对这个类的自动加载机制就有一定的了解了。
当使用的类没有被引入时会把这个类当做参数传到thinkphp/library/think/Loader.php的autoload方法中。
到这里在进行看一下autoload这个方法
先从findFile这个方法走,把未引入的类传入这个方法中,在findFile这个方法中会直接从classMap这个属性中直接把think\Error这个类映射的文件直接返回出来
将think\Error这个类的完整路径返回给autoload的file变量后,把win环境的大小写给判断了一次。
然后直接使用include引入文件即可,直到返回。
直到这里就是一次完整的类的自动加载解析。
虽然到这里结束了,但是还是得在提一点就是$classMap这个属性,这个属性是基于文件classmap.php来到,这个文件的生成也是需要执行命令php think optimize:autoload生成的。
当没有生成这个文件时程序是如何执行的呢!
之前的所有流程都是一样的,只有在findFile这里不一样,接下来进行简单的梳理一下。
这时代码肯定不会走classMap
先获取think\Error文件
然后经过Composer自动加载中的俩个属性进行获取命名空间,在把think\Error.php文件进行拼接
最终返回的结果也是D:\phpstudy_pro\WWW\ThinkPHPSourceCodeAnalysis\thinkphp\library\think\Error.php这个文件。
这里的代码需要好好的阅读一下。
类的自动加载到这里就是完全结束了。