【Laravel 5.1】【Composer】 PSR-4規約に沿ったComposerのオートロード

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;
    }
}