前言
上一章:(一) 入口文件index.php
本章记录Composer注册自动加载
正文
入口文件index.php中的
//引入Composer注册自动加载程序, Laravel的自动类文件自动加载等功能都是通过Composer来实现的
require __DIR__.'/../vendor/autoload.php';
引入autoload_real.php,并调用getLoader方法进行返回
class ComposerAutoloaderInitefecd9a4ccf7ee7d060537285d8fe08e
{
private static $loader;
public static function loadClassLoader($class)
{
if ('Composer\Autoload\ClassLoader' === $class) {
require __DIR__ . '/ClassLoader.php';
}
}
public static function getLoader()
{
//定义过不再进行定义,正常不会经过此环节
if (null !== self::$loader) {
return self::$loader;
}
//将本类的loadClassLoader方法注册为自动加载函数
//第二个参数true代表注册失败时会抛出异常
//第三个参数为true表示该自动加载函数是加入到注册函数队列的头部,
//这里可以直接导入这个类文件的,写成注册函数应该是作者的习惯
spl_autoload_register(array('ComposerAutoloaderInitefecd9a4ccf7ee7d060537285d8fe08e', 'loadClassLoader'), true, true);
//这里实例化composer 的 ClassLoader,上面的注册函数加载了实例化的类文件
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
//用完注销
spl_autoload_unregister(array('ComposerAutoloaderInitefecd9a4ccf7ee7d060537285d8fe08e', 'loadClassLoader'));
//判断 php 版本是否大于5.6,且没有定义 HHVM ,且定义或未执行
//zend_loader_file_encoded方法。这边主要看PHP版本大于等于5.6的
//情况其它的情况比较少见
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
if ($useStaticLoader) {
//加载autoload_static.php文件
require_once __DIR__ . '/autoload_static.php';
//调用getInitializer方法返回一个闭包函数使用call_user_func来执行该闭包函数
//主要用途就是 将ComposerStaticInitefecd9a4ccf7ee7d060537285d8fe08e类中的
//部分参数加载到ClassLoader类中
call_user_func(\Composer\Autoload\ComposerStaticInitefecd9a4ccf7ee7d060537285d8fe08e::getInitializer($loader));
} else {
//这个分支主要就是将composer的几个配置类中的数据加载到ClassLoader类中,
//跟上面差不多只是上面是加载到psr4相关的属性中去,这个分支主要是加载到psr0
//相关的属性中去;
$map = require __DIR__ . '/autoload_namespaces.php';
foreach ($map as $namespace => $path) {
$loader->set($namespace, $path);
}
$map = require __DIR__ . '/autoload_psr4.php';
foreach ($map as $namespace => $path) {
$loader->setPsr4($namespace, $path);
}
$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) {
$loader->addClassMap($classMap);
}
}
//调用ClassLoader中的register函数,将ClassLoader中的loadClass函数注册为自动加载函数
//后续框架中的大部分实例化自动加载都是通过该方法进行文件导入的
$loader->register(true);
//加载框架文件
if ($useStaticLoader) {
$includeFiles = Composer\Autoload\ComposerStaticInitefecd9a4ccf7ee7d060537285d8fe08e::$files;
} else {
$includeFiles = require __DIR__ . '/autoload_files.php';
}
//这里主要是加载框架依赖库中的公共助手方法等
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequireefecd9a4ccf7ee7d060537285d8fe08e($fileIdentifier, $file);
}
return $loader;
}
}
function composerRequireefecd9a4ccf7ee7d060537285d8fe08e($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
require $file;
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
}
}
这块代码主要就是为了引入composer中的自动加载方法没有什么复杂的逻辑
END