composer自动加载

理解自动加载函数的原理

在实例话一个类时,如有全局的自动加载函数,则会将类的命名空间及类名传入到加载函数,然后由加载函数解析加载对应的路径。

function autoload($classname) {
    $filename = "./". $classname .".php";
    include_once($filename);
  //传入的参数为 'App\myClass'
}

spl_autoload_register('autoload');

// we've called a class ***
$obj = new \App\myClass();

以下为composer autoload代码

在项目中引入 /vendor/autoload.php

autoload.php 代码如下

require_once __DIR__ . '/composer/autoload_real.php';
//引入文件
return ComposerAutoloaderInit049a9ec039ede8fcb8a98243cf5ce34b::getLoader();
//调用静态方法 并返回

getLoader 方法代码如下

 public static function getLoader()
    {
        //判断是否实例化,如已实例化则返回
        if (null !== self::$loader) {
            return self::$loader;
        }

        //注册自动加载函数
        spl_autoload_register(array('ComposerAutoloaderInit049a9ec039ede8fcb8a98243cf5ce34b', 'loadClassLoader'), true, true); 
        //返回自动加载      
        self::$loader = $loader = new \Composer\Autoload\ClassLoader();

        //将上面的自动加载函数移除            
        spl_autoload_unregister(array('ComposerAutoloaderInit049a9ec039ede8fcb8a98243cf5ce34b', 'loadClassLoader'));

        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
        //判断php环境和版本 因此选择加载方式
        if ($useStaticLoader) {
            require_once __DIR__ . '/autoload_static.php';
            //将命名空间和文件路径对应
            call_user_func(\Composer\Autoload\ComposerStaticInit049a9ec039ede8fcb8a98243cf5ce34b::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\ComposerStaticInit049a9ec039ede8fcb8a98243cf5ce34b::$files;
        } else {
            $includeFiles = require __DIR__ . '/autoload_files.php';
        }
        foreach ($includeFiles as $fileIdentifier => $file) {
            composerRequire049a9ec039ede8fcb8a98243cf5ce34b($fileIdentifier, $file);
        }
        //返回自动加载
        return $loader;
    }

这里将命名空间对应文件路径,并添加到loader的属性中

call_user_func(\Composer\Autoload\ComposerStaticInit049a9ec039ede8fcb8a98243cf5ce34b::getInitializer($loader));
        

$loader->register 将 \Composer\Autoload\ClassLoader(); 的loadclass 函数注册为自动加载函数

你可能感兴趣的:(composer自动加载)