在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;