版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a454213722/article/details/60469759
laravel中有两个自动加载的函数,今天主要讲composer生成的基于PSR规范【推荐阅读:laravel之PSR规范】的自动加载函数,另一个是laravel框架核心别名的自动加载函数
从入口文件开始
文件:laravel/public/index.php
<?php require __DIR__.'/../bootstrap/autoload.php';
文件:laravel/bootstrap/autoload.php
<?php define('LARAVEL_START', microtime(true)); require __DIR__.'/../vendor/autoload.php';
vendor/autoload.php是composer生成的自动加载函数
文件:laravel/vendor/autoload.php
<?php require_once __DIR__ . '/composer' . '/autoload_real.php'; return ComposerAutoloaderInitb79a28d3e0a6ccef1b706e9ea3f04bb8::getLoader();
文件:laravel/composer/autoload_real.php
<?php class ComposerAutoloaderInitb79a28d3e0a6ccef1b706e9ea3f04bb8 { 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('ComposerAutoloaderInitb79a28d3e0a6ccef1b706e9ea3f04bb8', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(); spl_autoload_unregister(array('ComposerAutoloaderInitb79a28d3e0a6ccef1b706e9ea3f04bb8', 'loadClassLoader')); $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION'); if ($useStaticLoader) { require_once __DIR__ . '/autoload_static.php'; call_user_func(\Composer\Autoload\ComposerStaticInitb79a28d3e0a6ccef1b706e9ea3f04bb8::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\ComposerStaticInitb79a28d3e0a6ccef1b706e9ea3f04bb8::$files; } else { $includeFiles = require __DIR__ . '/autoload_files.php'; } foreach ($includeFiles as $fileIdentifier => $file) { composerRequireb79a28d3e0a6ccef1b706e9ea3f04bb8($fileIdentifier, $file); } return $loader; } } ////省略代码
文件:laravel/composer/ClassLoader.php
<?php namespace Composer\Autoload; class ClassLoader { //省略代码 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; } } //省略代码 }
composer自动加载过程
文件vendor/autoload.php
加载文件autoload_real.php
并且调用getLoader
方法getLoader
方法里面实例化\Composer\Autoload\ClassLoader();
即composer/ClassLoader.php
类,这里类的路径不一样主要是跟ClassLoader.php
空间命名namespace
有关,
然后调用了$loader->register(true);
即调用了ClassLoader.php
的文件中的register
方法,使用spl_autoload_register
【推荐阅读:php spl autoLoad机制】开始加载,然后include
文件
QQ交流群:136351212
查看原文: