laravel composer自动加载函数

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
查看原文:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值