laravel框架关键技术解析03-2 composer自动加载

在laravel框架中,通过sql_autoload_register()实现类自动加载函数的注册。sql_autoload_register自动加载的函数队列中包含了两个类的自动加载函数。
一个是composer生成的基于PSR规范的自动加载函数
另一个是laravel框架核心别名的自动加载函数

composer生成的自动加载函数注册过程
在laravel入口文件index.php中开头
在这里插入图片描述
继续看autoload.php
在这里插入图片描述
再看aotoload_real.php
在这里插入图片描述
到此即真正到达了查找代码的地方
整体逻辑
在这里插入图片描述
整理逻辑是,autoload_real.php操纵核心类ClassLoader,提取各个配置文件中的配置,将类的命名空间与文件路径的对应关系注册到相应属性中,然后当使用一个包含的类名时,会根据对应关系查找文件路径,实现类的自动加载。
源码分析
为了直观一点,打印下变量loader
在这里插入图片描述
当然它这里对每个配置文件做了一些整合,比较直观的psr-4数组有44个,classMap最多达到了3430个文件的映射。 psr-4因为一般已弃用所以为空数组。

再来看看各个类文件中到底存了神马
在这里插入图片描述
classmap里相当多,把每个php文件都做了映射。
在这里插入图片描述
namespace较少,应该是单独把一些藏得较深的命名空间缩短了。
在这里插入图片描述
psr-4应该主要文件夹的映射
在这里插入图片描述
static可能是静态类文件
在这里插入图片描述
files中是全局文件,例如dd方法是dump.php中定义的,还有helper文件提供了公共的函数方法。

也就是说autoload_read.php的getLoader()方法干了两件事情,第一加载所有的配置文件中的映射,储存在核心类ClassLoader中的$loader对象属性中。第二注册了自动加载函数。
回过头来分析源码;
在这里插入图片描述
接下来
在这里插入图片描述
这里应该是如果为框架的各个配置文件做了一个静态化处理,则直接读取静态文件,这样效率会快很多。如果没有做静态处理,就分别把配置文件储存到核心类的属性中。
在这里插入图片描述
上边说到,getLoader()方法干了两件事情。第一加载所有的配置文件中的映射,储存在核心类ClassLoader中的loader对象属性中。第二注册了自动加载函数。
以上是存贮,那么这一句代码是注册自动加载的关键代码。回头再来看这个句代码,先往下进行。
在这里插入图片描述
如果对autoload_files.php中的配置做了静态化处理,则直接读取。否则读取autoload_files.php原文件配置,并且遍历配置,分别引入文件。这个配置文件中记录的PHP文件并不需要注册自动加载,因为不是类,而是一些函数库。
最后把这个loader对象属性返回给入口文件index.php,成为一个全局对象变量。
再来看在这里插入图片描述
在这里插入图片描述
注册自动加载函数就比较简单了,注册的自动加载函数即为loadClass()方法,
当在项目中,new 一个类时,就会触发调用这个函数,从属性中获取对应的映射,即文件的真实路径,然后include,就完成了类的自动加载。
如果你对sql_autoload_register方法不太了解,则需要看下手册,这里第一个参数为[类,方法],第二参数为true时,为注册失败抛出异常,第三参数为true时为把这个autoload方法(loadClass() )放在自动加载函数队列的首位,通俗讲就是优先匹配。

因为laravel还有注册了一个自动加载函数,框架核心别名的自动加载。
源码地址在Illuminate\Foundation\AliasLoader.php
end;

猜你喜欢

转载自blog.csdn.net/yt_php/article/details/85226236