您的位置:首页 > 编程语言 > PHP开发

laravel composer自动加载函数

2017-03-05 18:02 405 查看
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
查看原文:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: