以手上的4.2爲準,本篇只看自動加載部分。php
入口文件在:/public/index.php
,打開看看。html
<?php require __DIR__.'/../bootstrap/autoload.php';
來到 /bootstrap/autoload.php
laravel
<?php // 記錄Laravel開始加載的時間 define('LARAVEL_START', microtime(true)); // 下一步看看這個文件 require __DIR__.'/../vendor/autoload.php';
來到 /vendor/autoload.php
bootstrap
<?php // 下一步看看這個文件 require_once __DIR__ . '/composer' . '/autoload_real.php'; // 預告:require了上面這個文件以後,執行了上面文件中的getLoader()方法,類名是動態生成的 return ComposerAutoloaderInit78fadea5a0911ad1d52c374950318f50::getLoader();
終於來到 /vender/composer/autoload_real.php
composer
<?php // 動態生成的類名 class ComposerAutoloaderInit78fadea5a0911ad1d52c374950318f50 { private static $loader; public static function loadClassLoader($class) { // 臨時的加載函數,只容許加載Composer\Autoload\ClassLoader if ('Composer\Autoload\ClassLoader' === $class) { require __DIR__ . '/ClassLoader.php'; } } public static function getLoader() { if (null !== self::$loader) { return self::$loader; } // 註冊本身的自動加載函數,就在上面。 // 第三個參數是true,將本身的自動加載函數註冊到隊列之首。 spl_autoload_register(array('ComposerAutoloaderInit78fadea5a0911ad1d52c374950318f50', 'loadClassLoader'), true, true); // 藉助自動加載函數 加載ClassLoader到$loader self::$loader = $loader = new \Composer\Autoload\ClassLoader(); // 把剛剛註冊的自動加載函數註銷掉。是的,就是這麼任性,臨時用了一下 spl_autoload_unregister(array('ComposerAutoloaderInit78fadea5a0911ad1d52c374950318f50', 'loadClassLoader')); // 設置 include_path $includePaths = require __DIR__ . '/include_paths.php'; array_push($includePaths, get_include_path()); set_include_path(join(PATH_SEPARATOR, $includePaths)); // 登記以PSR-0方式加載的類們 $map = require __DIR__ . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { $loader->set($namespace, $path); } // 登記以PSR-4方式加載的類們 $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); // 加載一些文件,這些文件的目的是註冊一些函數 $includeFiles = require __DIR__ . '/autoload_files.php'; foreach ($includeFiles as $fileIdentifier => $file) { // 借用下面的方法去加載 composerRequire78fadea5a0911ad1d52c374950318f50($fileIdentifier, $file); } // 到此自動加載結束,層層跳回 return $loader; } } function composerRequire78fadea5a0911ad1d52c374950318f50($fileIdentifier, $file) { // 若是加載過了就不重複加載 if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { require $file; // 加載過以後給個標記 $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; } }
博客:http://blog.lovemydeer.com/2016/03/22/laravel4dot2-autoload.html函數