背景:使用composer下载laravel,仅仅记录启动流程,‘/’表示index.php所在目录
地址:入口文件index.php
require __DIR__.'/../vendor/autoload.php';//加载composer自动加载器
/…/vendor/autoload.php
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit::getLoader();//执行静态方法getLoader();
/…/vendor/composer/autoload_real.php
public static function getLoader()
{
spl_autoload_register(['ComposerAutoloaderInit','loadClassLoader']), true, true);//注册临时自动加载函数
self::$loader = $loader = new \Composer\Autoload\ClassLoader();//赋值静态属性为继承了PSR-0, PSR-4接口的ClassLoader实例,在该类中进行了最终自动加载函数的注册
spl_autoload_unregister(['ComposerAutoloaderInit', 'loadClassLoader']);//注销临时自动加载函数
require_once __DIR__ . '/autoload_static.php';//存放class名映射文件的脚本文件
call_user_func(\Composer\Autoload\ComposerStaticInit::getInitializer($loader));//为$loader属性赋值,其中classMap映射类名与我文件,
$loader->register(true);//将$loader的loadClass方法注册为自动加载函数
$includeFiles = Composer\Autoload\ComposerStaticInit::$files;//引入注册函数文件
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequire($fileIdentifier, $file);
}
return $loader;//返回自动加载器实例
}
其中call_user_func(\Composer\Autoload\ComposerStaticInit::getInitializer($loader))返回了一个匿名函数,然后call_user_func执行了该函数
/…/vendor/composer/autoload_static.php
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInit::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit::$prefixDirsPsr4;
$loader->fallbackDirsPsr4 = ComposerStaticInit::$fallbackDirsPsr4;
$loader->prefixesPsr0 = ComposerStaticInit::$prefixesPsr0;
$loader->classMap = ComposerStaticInit::$classMap;
}, null, ClassLoader::class);
}
\Closure代表匿名函数类,bind方法绑定一个匿名函数,其中null代表默认不绑定在实例中,也可以在该参数中添加实例,如果添加实例后,则通常需要在第三个参数中声明namespace+class,该文件中需要操作$loader,则需要声明ClassLoader::class