0%

Composer自动加载原理

Composer自动加载原理

autoload.php

入口文件autoload.php中非常简单, 引入了autoload_real.php并调用了ComposerAutoloaderInitXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX::getLoader()

autoload_real.php

1
2
3
spl_autoload_register(array('ComposerAutoloaderInitXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
spl_autoload_unregister(array('ComposerAutoloaderInitXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', 'loadClassLoader'));

getLoader中首先注册了自身的loadClassLoader方法用于自动加载ClassLoader.php, 在加载完成后马上注销了该自动加载

然后分别注册autoload_namespaces, autoload_psr4, autoload_classmap
可以看到这几个文件中保存的都是类似 类名 => 位置的键值对
接着$loader->register(true);进行注册
最后引入autoload_files

ClassLoader.php

1
2
3
4
5
6
7
8
9
10
11
12
13
public function register($prepend = false)
{
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
}

public function loadClass($class)
{
if ($file = $this->findFile($class)) {
includeFile($file);

return true;
}
}

在register方法中将自身的loadClass方法注册为自动载入实现
剩下的就比较简单了
loadClass中的findFile通过类名在autoload_real.php中注册的几坨键值对去查找对应的位置, 找到就加载