首先在框架的入口index.php中引入base.php,base.php引入Loader类(thinkphp/library/think/Loader.php)
这个Loader类就是tp框架自动加载的核心类。
还需要另一个文件,/vendor/composer/autoload_static.php。查看tp框架类的自动加载基本上是在这个两个文件里来回切换哦。
如上图,autoload_static.php文件中类的两个属性,类自动加载就靠这哥俩了0.0
然后来看Loader.php的流程:
核心代码在94到97行,把autoload_static.php中的两个属性数组赋值给Loader类的两个名称一样的属性。
然后调用addNamespace方法,把thinkphp/library/think、traits加入到数组中(294到302行)
数组如下:
还有其他runtime(classmap.php)、extend两个文件夹的类文件,我们主要查看上面两个数组。
现在到了执行的时候:
执行autoload方法:126-128行判断该类是否在别名数组中,如果存在就通过别名调用。但base.php中执行Error::register()的Error类并不在别名数组中,所以继续向下执行到了findFile方法:
classmap在上面提到过就先不说了,在161到170行,以执行的think\Error为例,遍历两个数组,通过长度截掉think\字符串,然后拼接物理地址与类名.php,然后include该文件,达到了自动加载类的效果。