Laravelアプリ内において、
Composerがオートロード機能を実行する様子を見るために
ソースコードを追ってみます。
まずは、treeコマンドで、
Composerに関するディレクトリ&ファイルのみを
抜き出してみる。
[tree コマンドのオプション] tree -a -L 2
[Composerのオートロードに関する部分だけ抜粋]
. ├── app ├── bootstrap │ └── autoload.php ├── composer.json ├── composer.lock ├── config ├── public │ ├── .htaccess │ ├── index.php │ └── web.config └── vendor ├── autoload.php ├── classpreloader └── composer
ソースコードを順に追っていくと...。
[1.] [ /public/index.php ]
/* |-------------------------------------------------------------------------- | Register The Auto Loader |-------------------------------------------------------------------------- | | Composer provides a convenient, automatically generated class loader for | our application. We don't have to worry about manual | loading any of our classes later on. | */ require __DIR__.'/../bootstrap/autoload.php';
[2.] [ /bootstrap/autoload.php ]
/* |-------------------------------------------------------------------------- | Register The Composer Auto Loader |-------------------------------------------------------------------------- | | Composer provides a convenient, automatically generated class loader | for our application. We do not have to worry about the | loading of any our classes "manually". | */ require __DIR__.'/../vendor/autoload.php';
[3.] [ /vendor/autoload.php ]
<?php // autoload.php @generated by Composer require_once __DIR__ . '/composer/autoload_real.php'; return ComposerAutoloaderInit [HashValue] ::getLoader();
[4.] [ /vendor/composer/autoload_real.php ]
// autoload_real.php @generated by Composer class ComposerAutoloaderInit [HashValue] { 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; } spl_autoload_register(array('ComposerAutoloaderInit[HashValue]', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(); spl_autoload_unregister(array('ComposerAutoloaderInit[HashValue]', 'loadClassLoader')); $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { require_once __DIR__ . '/autoload_static.php'; call_user_func(\Composer\Autoload\ComposerStaticInit[HashValue]::getInitializer($loader)); } else { $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); } } $loader->register(true); if ($useStaticLoader) { $includeFiles = Composer\Autoload\ComposerStaticInit[HashValue]::$files; } else { $includeFiles = require __DIR__ . '/autoload_files.php'; } foreach ($includeFiles as $fileIdentifier => $file) { composerRequire[HashValue]($fileIdentifier, $file); } return $loader; } }