Laravel (5.5.33) 加载过程(一)

说明:

 由于公司项目使用Laravel 框架  也是第一次接触此框架  作为一个新手 记录使用过程的一些事情  以及对于框架源码分析的记录  整理自己的思路 也希望对大家有帮助  如果那里不对的地方  可以留言给我

 

 

 


 

本次目的 

本次了解pubilc/index.php中的第一行代码 实现的功能

 

/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader for
| our application. We just need to utilize it! We'll simply require it
| into the script here so that we don't have to worry about manual
| loading any of our classes later on. It feels nice to relax.
|
*/

require __DIR__.'/../bootstrap/autoload.php';

 

 

 

 

 


 

功能大致内容

 1.记录运行时间

 2.注册实现懒加载

 3.如果有自己定义的第三方文件 bootstrap/cache/compiled.php  引入该文件  

 


bootstrap/autoload.php 代码分析

 1.记录框架运行的时间

define('LARAVEL_START', microtime(true));

 

2.实现自定义方法的文件引入    该文件位于/bootstrap/cache/compiled.php  

$compiledPath = __DIR__.'/cache/compiled.php';


if (file_exists($compiledPath)) {
    require $compiledPath;
}

 

3(重点部分 ) 实现类的懒加载

/*
|--------------------------------------------------------------------------
| Register The Composer Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader
| for our application. We just need to utilize it! We'll require it
| into the script here so that we do not have to worry about the
| loading of any our classes "manually". Feels great to relax.
|
*/

require __DIR__.'/../vendor/autoload.php';

  

 3.1流程图

  

  3.2 注释代码

<?php

use phpDocumentor\Reflection\DocBlock\Tags\Var_;
use Symfony\Component\VarDumper\VarDumper;

// autoload_real.php @generated by Composer

class ComposerAutoloaderInit98979ba43685ad709d46df8619e90b69
{
    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;
        }

        /**
         * @link http://php.net/manual/zh/function.spl-autoload-register.php
         * 注册给定的函数作为 __autoload 的实现
         * 使用本类中的loadClassLoader 函数实现__autoload 功能 并且放入spl_autoload_register队列之首
         */
        spl_autoload_register(array('ComposerAutoloaderInit98979ba43685ad709d46df8619e90b69', 'loadClassLoader'), true, true);
        
        
        /**
         * 由于上面注册类ComposerAutoloaderInit98979ba43685ad709d46df8619e90b69::loadClassLoader 加载方法 new的时候 调用该方法
         */
        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
        
        /**
         * @link http://php.net/manual/zh/function.spl-autoload-unregister.php
         * 注销已注册的__autoload()函数
         * 将本类中的loadClassLoader 注册方法注销 
         */
        spl_autoload_unregister(array('ComposerAutoloaderInit98979ba43685ad709d46df8619e90b69', 'loadClassLoader'));

        /**
         * @link http://php.net/manual/zh/reserved.constants.php#reserved.constants.core  
         * PHP_VERSION_ID 作为系统参量保存
         * HHVM_VERSION 是否使用HHVM
         * @link http://files.zend.com/help/Zend-Guard-5/zend_guard_api.htm
         * zend_loader_file_encoded PHP文件是否加密方法存在
         * 
         * 如果是ture  表示版本大于5.6  没有使用HHVM  不存在加密文件
         */
        
        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
       
        //表示版本大于5.6  没有使用HHVM  不存在加密文件
        if ($useStaticLoader) {
            //引入 vendor/composer/autoload_static.php 文件 
            require_once __DIR__ . '/autoload_static.php';
            
            /**
             * 该方法 理解可能存在问题  希望大家指出
             * 1.运行 vendor/composer/autoload_static.php 中的getInitializer 方法 返回一个匿名函数  函数的内容为
             *     function () use ($loader) {
             *        $loader->prefixLengthsPsr4 = ComposerStaticInit98979ba43685ad709d46df8619e90b69::$prefixLengthsPsr4;
             *        $loader->prefixDirsPsr4 = ComposerStaticInit98979ba43685ad709d46df8619e90b69::$prefixDirsPsr4;
             *        $loader->prefixesPsr0 = ComposerStaticInit98979ba43685ad709d46df8619e90b69::$prefixesPsr0;
             *        $loader->classMap = ComposerStaticInit98979ba43685ad709d46df8619e90b69::$classMap;
             *    }
             *    2. 调用call_user_func 方法执行第一步的匿名函数
             *  
             *  说明: 步骤一传入的loadClassLoader对象 此处 说明文档 http://blog.csdn.net/mizhenxiao/article/details/51909398
             *       由loadClassLoader 执行秘密函数  给自身赋值
             *       由于传递过程中loadClassLoader 一直使用的为同一个对象  系统的对象编号没有发生编号  
             *           所以 loadClassLoader中的prefixLengthsPsr4,prefixDirsPsr4,prefixesPsr0,classMap 替换成了vendor/composer/autoload_static.php 类中的对于的属性
             */
            call_user_func(\Composer\Autoload\ComposerStaticInit98979ba43685ad709d46df8619e90b69::getInitializer($loader));
        } else {
            //引入 vendor/composer/autoload_namespaces.php文件 
            $map = require __DIR__ . '/autoload_namespaces.php';
            /**
             * 1.接受 vendor/composer/autoload_namespaces.php 返回的数组
             * 2.调用loadClassLoader 类中的set方法设置
             */
            foreach ($map as $namespace => $path) {
                $loader->set($namespace, $path);
            }

            /**
             * 1.接受 vendor/composer/autoload_psr4.php 返回的数组
             * 2.调用loadClassLoader 类中的setPsr4方法设置
             */
            $map = require __DIR__ . '/autoload_psr4.php';
            foreach ($map as $namespace => $path) {
                $loader->setPsr4($namespace, $path);
            }

            /**
             * 1.接受 vendor/composer/autoload_classmap.php 返回的数组
             * 2.调用loadClassLoader 类中的addClassMap方法设置
             */
            $classMap = require __DIR__ . '/autoload_classmap.php';
            if ($classMap) {
                $loader->addClassMap($classMap);
            }
        }

        /**
         * 调用loadClassLoader 的register
         * 注册给定的函数作为 __autoload 的实现 使用loadClassLoader类下的 loadClass方法
         */
        $loader->register(true);

        //表示版本大于5.6  没有使用HHVM  不存在加密文件
        if ($useStaticLoader) {
            //接受vendor/composer/autoload_static.php 下的$files 数组
            $includeFiles = Composer\Autoload\ComposerStaticInit98979ba43685ad709d46df8619e90b69::$files;
        } else {
            //vendor/composer/autoload_files.php 返回数组
            $includeFiles = require __DIR__ . '/autoload_files.php';
        }
        //全局优先加载 文件
        foreach ($includeFiles as $fileIdentifier => $file) {
            composerRequire98979ba43685ad709d46df8619e90b69($fileIdentifier, $file);
        }

        return $loader;
    }
}

function composerRequire98979ba43685ad709d46df8619e90b69($fileIdentifier, $file)
{
    if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
        require $file;

        $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
    }
}

 

 


 

小尾巴  

如果其中有什么问题 希望大家留意   

 

posted on 2018-02-11 11:38  Sunlight1992  阅读(471)  评论(0编辑  收藏  举报

导航