美文网首页
composer自动加载

composer自动加载

作者: code_nerd | 来源:发表于2017-12-05 09:53 被阅读0次

    理解自动加载函数的原理

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

    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自动加载

          本文链接:https://www.haomeiwen.com/subject/jwrqixtx.html