说明:

 由于公司项目使用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;
}
}

小尾巴

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

Laravel (5.5.33) 加载过程(一)的更多相关文章

  1. Laravel (5.5.33) 加载过程---instance方法(二)

    在bootstrap/app.php /** * 对于其中的instance register singleton 方法到时候单独拎出来说明 * * 1.设置基础路径 * 2.使用instance 方 ...

  2. Laravel (5.5.33) 加载过程(二)

    本次说明代码 /* |-------------------------------------------------------------------------- | Turn On The ...

  3. Laravel (5.5.33) 加载过程---make方法(四)

    /** * Resolve the given type from the container. * * @param string $abstract * @return mixed */ publ ...

  4. 重温.NET下Assembly的加载过程 ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线

    重温.NET下Assembly的加载过程   最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后 ...

  5. 工厂模式模拟Spring的bean加载过程

    一.前言    在日常的开发过程,经常使用或碰到的设计模式有代理.工厂.单例.反射模式等等.下面就对工厂模式模拟spring的bean加载过程进行解析,如果对工厂模式不熟悉的,具体可以先去学习一下工厂 ...

  6. linux内核启动以及文件系统的加载过程

    Linux 内核启动及文件系统加载过程 当u-boot 开始执行 bootcmd 命令,就进入 Linux 内核启动阶段.普通 Linux 内核的启动过程也可以分为两个阶段.本文以项目中使用的 lin ...

  7. Inside Flask - flask 扩展加载过程

    Inside Flask - flask 扩展加载过程 flask 扩展(插件)通常是以 flask_<扩展名字> 为扩展的 python 包名,而使用时,可用 import flask. ...

  8. web.xml 的加载过程

    初始化过程: 在启动Web项目时,容器(比如Tomcat)会读web.xml配置文件中的两个节点<listener>和<contex-param>. 接着容器会创建一个Serv ...

  9. Browser默认书签加载过程

    Browser配置默认书签——string.xml中<string-array name="bookmarks" translatable="false" ...

随机推荐

  1. 51Nod 1004 n^n的末位数字(日常复习快速幂,莫名的有毒,卡mod值)

    1004 n^n的末位数字 题目来源: Author Ignatius.L (Hdu 1061) 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 给出一个整数N,输出 ...

  2. [bzoj1706] [usaco2007 Nov]relays 奶牛接力跑

    大概是叫倍增Floyd? 显然最多200个点...f[i][j][k]表示从j到k,走2^i步的最小路程.就随便转移了.. 查询的话就是把n二进制位上是1的那些都并起来. #include<cs ...

  3. Codeforces Round #452 (Div. 2)-899A.Splitting in Teams 899B.Months and Years 899C.Dividing the numbers(规律题)

    A. Splitting in Teams time limit per test 1 second memory limit per test 256 megabytes input standar ...

  4. vim与外部文件的粘帖复制

    vim与外部文件的粘帖复制 ubuntu默认vim是不支持从外部文件与vim之间的粘帖复制,vim有自己的剪切版,分别是”0-”9,”-,”8,”+,”:,”/,”%,”i,这些都是vim的寄存器,可 ...

  5. HDU 1232 畅通工程(模板——并查集)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1232 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出 ...

  6. 十二个 ASP.NET Core 例子——配置操作

    目录: 简单配置(利用configration 键值读取) 使用选项和配置对象(自定义类绑定配置文件实现读取) IOptionsSnapshot(配置文件更改时也变化) 内存数据放到配置对象中 实体框 ...

  7. dedecms后台系统基本参数标题

    1,站点设置 2,核心设置 3,附件设置 4,会员设置 6,性能选项 7,其它选项 8,模块设置 在E:\wamp\www\dededln\back\inc\configgroup.txt

  8. Codeforces 900 E. Maximum Questions (DP,技巧)

    题目链接:900 E. Maximum Questions 题意: 给出一个长度为n只含有a和b还有'?'的串s,且'?'可以被任意替换为a或b.再给出一个字符串t (奇数位上为a,偶数位上为b,所以 ...

  9. Steeze框架之入门使用

    一.介绍 steeze是一个优雅.简洁而又高效的PHP开源框架,在整合了知名框架ThinkPHP和Laravel优点的同时,重写了底层架构,增强了功能实现.支持swoole模型运行,支持容器.模型.依 ...

  10. linux_远程连接

    为什么要远程连接linux服务器? 温度.湿度.电力各种影响,有的企业使用阿里云服务器,更加接触不到机房,所有需要通过远程连接服务器来进行管理 IP地址? 互联网上的计算机,都会有一个唯一的32位地址 ...