Laravel (5.5.33) 加载过程(一)
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 阅读(…) 评论(…) 编辑 收藏