首先在框架的入口index.php中引入base.php,base.php引入Loader类(thinkphp/library/think/Loader.php)

这个Loader类就是tp框架自动加载的核心类。

还需要另一个文件,/vendor/composer/autoload_static.php。查看tp框架类的自动加载基本上是在这个两个文件里来回切换哦。

tp5.1框架源码之类的自动加载

如上图,autoload_static.php文件中类的两个属性,类自动加载就靠这哥俩了0.0

然后来看Loader.php的流程:

tp5.1框架源码之类的自动加载

核心代码在94到97行,把autoload_static.php中的两个属性数组赋值给Loader类的两个名称一样的属性。

tp5.1框架源码之类的自动加载

tp5.1框架源码之类的自动加载

tp5.1框架源码之类的自动加载

然后调用addNamespace方法,把thinkphp/library/think、traits加入到数组中(294到302行)

数组如下:

tp5.1框架源码之类的自动加载

tp5.1框架源码之类的自动加载

还有其他runtime(classmap.php)、extend两个文件夹的类文件,我们主要查看上面两个数组。

现在到了执行的时候:

tp5.1框架源码之类的自动加载

执行autoload方法:126-128行判断该类是否在别名数组中,如果存在就通过别名调用。但base.php中执行Error::register()的Error类并不在别名数组中,所以继续向下执行到了findFile方法:

tp5.1框架源码之类的自动加载

classmap在上面提到过就先不说了,在161到170行,以执行的think\Error为例,遍历两个数组,通过长度截掉think\字符串,然后拼接物理地址与类名.php,然后include该文件,达到了自动加载类的效果。

相关文章:

  • 2022-12-23
  • 2021-12-03
  • 2021-11-28
  • 2022-12-23
  • 2021-05-23
  • 2021-11-07
  • 2021-07-16
猜你喜欢
  • 2021-05-27
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-10
相关资源
相似解决方案