laravel 框架 源码解读 01 bootstrap 引入composer

访问 public目录下的index.php 入口文件

require DIR.’/../bootstrap/autoload.php’;
在这里引入了框架 类自动加载的文件 在DIR.’/../bootstrap/autoload.php中 实际 引入了 require DIR.’/../vendor/autoload.php’;

接下来是composer的autoload.php文件中的故事

require_once DIR . ‘/composer/autoload_real.php’;

return ComposerAutoloaderInit588ef64a8f8e0cc101a16ea4a5b588bf::getLoader();

执行了getLoader这个静态方法

其中的代码是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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;
}
为php注册自动加载类的方法 此处注册的composer的自动加载类 也就是当前类的上面的loadClassLoader方法
spl_autoload_register(array('ComposerAutoloaderInit588ef64a8f8e0cc101a16ea4a5b588bf', 'loadClassLoader'), true, true);


自动加载的类 新建对象
self::$loader = $loader = new \Composer\Autoload\ClassLoader();

去掉上面的自动加载方法注册
spl_autoload_unregister(array('ComposerAutoloaderInit588ef64a8f8e0cc101a16ea4a5b588bf', 'loadClassLoader'));

判断php版本号大于50600 并且不是在hhvm环境中
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION');
if ($useStaticLoader) {
如果是静态加载 就引入静态加载类
require_once __DIR__ . '/autoload_static.php';

call_user_func(\Composer\Autoload\ComposerStaticInit588ef64a8f8e0cc101a16ea4a5b588bf::getInitializer($loader));

/*
此为上面的方法作用的表示
返回一个闭包。闭包的作用是给自动加载类 动态绑定具体的自动加载方法
执行此闭包

public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInit588ef64a8f8e0cc101a16ea4a5b588bf::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit588ef64a8f8e0cc101a16ea4a5b588bf::$prefixDirsPsr4;
$loader->prefixesPsr0 = ComposerStaticInit588ef64a8f8e0cc101a16ea4a5b588bf::$prefixesPsr0;
$loader->classMap = ComposerStaticInit588ef64a8f8e0cc101a16ea4a5b588bf::$classMap;

}, null, ClassLoader::class);
}
*/
} else {
动态的加载类

引入 命名空间文件 是一个二维数组 保存了命名空间到 具体文件夹的对应关系
$map = require __DIR__ . '/autoload_namespaces.php';
foreach ($map as $namespace => $path) {
$loader->set($namespace, $path);
}
psr4格式的 文件夹对应关系
$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);
}
}

$loader->register(true);
实际调用了。 spl_autoload_register(array($this, 'loadClass'), true, $prepend); 进行注册
loadClass方法就是在类的自动加载函数的时机使用方法


以下代码 就是为了引入自动加载的文件 不解释了
if ($useStaticLoader) {
$includeFiles = Composer\Autoload\ComposerStaticInit588ef64a8f8e0cc101a16ea4a5b588bf::$files;
} else {
$includeFiles = require __DIR__ . '/autoload_files.php';
}
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequire588ef64a8f8e0cc101a16ea4a5b588bf($fileIdentifier, $file);
}

return $loader;
}

function composerRequire588ef64a8f8e0cc101a16ea4a5b588bf($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
require $file;

$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
}
}

composer的自动加载完毕

以上主要篇幅都是composer中的自动加载代码 与laravel 其实无关 以后才是laravel的真正开始