laravel composer自动加载函数

来源:互联网 发布:慢跑 摇摆 知乎 编辑:程序博客网 时间:2024/05/16 17:32

laravel中有两个自动加载的函数,今天主要讲composer生成的基于PSR规范【推荐阅读:laravel之PSR规范】的自动加载函数,另一个是laravel框架核心别名的自动加载函数
从入口文件开始

文件:laravel/public/index.php

<?phprequire __DIR__.'/../bootstrap/autoload.php';

文件:laravel/bootstrap/autoload.php

<?phpdefine('LARAVEL_START', microtime(true));require __DIR__.'/../vendor/autoload.php';

vendor/autoload.php是composer生成的自动加载函数

文件:laravel/vendor/autoload.php

<?phprequire_once __DIR__ . '/composer' . '/autoload_real.php';return ComposerAutoloaderInitb79a28d3e0a6ccef1b706e9ea3f04bb8::getLoader();

文件:laravel/composer/autoload_real.php

<?phpclass 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

<?phpnamespace 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
查看原文:
0 0
原创粉丝点击