文档章节

自动加载函数流程之composer autoload_real.php

s
 shangshandalaohu
发布于 2017/06/05 08:25
字数 866
阅读 3
收藏 0
点赞 0
评论 0

我们探索了 从

1 app/public/index.php 开始

2 加载 bootstrap /autoload.php 文件

3 然后加载到 vendor / autoload.php文件

4 然后终于找到了 /vendor/composer/autoload_real.php 文件

 

终于开始了 真正的自动加载,在这里 他封装了一个类。

而且这个类,也是十分 奇特,是 一个 ComposerAutoLoaderInit[salt] 一个非常特殊的类! 跟自动生成是类似的。

通过静态函数 getLoader 函数,执行 内部的 方法。

 

 

我们首先看一下这个神器的文件,里面包含两个部分的内容:

1 ComposerAutoLoaderInit[salt] 类

2 composerRequire[salt] 函数

 

在类内部:包含 1个 私有的变量函数 就是 loader 函数

包含两个内部的函数:

     1 loaderClassLoader(class):void 函数

     2 getLoader():Composer\Autoload\Composer

 

下面细分一下 getLoader()函数内部的情况,

     首先进行了 单列变量的一个判读 也就是说 $loader 变量 里面是否存有相关数据

if (null !== self::$loader) {
    return self::$loader;

}

如果存有的话,直接返回,停止向后执行。

否则!

正式开始 自动加载的流程:

第一步:注册系统自动加载函数

spl_autoload_register(array('ComposerAutoloaderInitf0edef8d82d469d4cfba4316d7feb75f''loadClassLoader'), truetrue);

 

知识点扩展:

spl_autoload_register

这个函数:

bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )

spl_autoload_register 可以很好地处理需要多个加载器的情况,这种情况下 spl_autoload_register 会按顺序依次调用之前注册过的加载器。作为对比, __autoload 因为是一个函数,所以只能被定义一次。

autoload_function

欲注册的自动装载函数。如果没有提供任何参数,则自动注册 autoload 的默认实现函数spl_autoload()

throw

此参数设置了 autoload_function 无法成功注册时, spl_autoload_register()是否抛出异常。

prepend

如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。

 

上述用法解析为:自动加载 类的 loadClassLoader 函数,如果添加异常,则抛出异常, 后面的true 代表 添加的 序列 之首。

 

然后回到正途:

第二步:实例化 这个 ClassLoader 类

self::$loader = $loader = new \Composer\Autoload\ClassLoader();

并且赋值给 当前的单例句柄。

第三步:删除已经注册的自动加载函数

spl_autoload_unregister — 注销已注册的__autoload()函数

 

综合上述三步:就是为了 能够 让 self::$laoder = $loader 能够被实例化!

如果,仅仅是为了实现这个,我觉得,还不如,直接

就自动加载函数文件。

 

接下来手下加载命名空间:

1 $map = require __DIR__ . '/autoload_namespaces.php';

foreach ($map as $namespace => $path) {
    $loader->set($namespace, $path);

}

同 ClassLoader.php 里面的 set函数 把 文件存入变量 仓库

$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;

注意:这里的0是我们的 第一个字母。

 

第二步:注册psr4标准的文件 的命名 空间 对应的路径 

$map = require __DIR__ . '/autoload_psr4.php';
foreach ($map as $namespace => $path) {
    $loader->setPsr4($namespace, $path);

}

$this->prefixDirsPsr4[$prefix] = (array) $paths;

第三:

$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) {
    $loader->addClassMap($classMap);

}

 

$this->classMap = array_merge($this->classMap, $classMap);

 

 

注册真正的 spl_autoload_register 方法为 ClassLoader->loaderClass 方法,

 

加载全部的自动加载的文件

$includeFiles = require __DIR__ . '/autoload_files.php';
foreach ($includeFiles as $fileIdentifier => $file) {
    composerRequiref0edef8d82d469d4cfba4316d7feb75f($fileIdentifier, $file);

}

 

返回 实例化的 后的处理类对象。

处理完成

 

总结:

1 就是按照 各种标准 加载 命名空间对应的路径

2 按照psr4标准 加载命名空间对应的路径

3 加载 系统需要加载的类文件

4 注册自动加载函数

5 加载 帮助函数

 

php初学者-千锋php课程笔记

© 著作权归作者所有

共有 人打赏支持
s
粉丝 0
博文 34
码字总数 6669
作品 0
自动加载函数流程之composer autoload_real.php

我们探索了 从 1 app/public/index.php 开始 2 加载 bootstrap /autoload.php 文件 3 然后加载到 vendor / autoload.php文件 4 然后终于找到了 /vendor/composer/autoload_real.php 文件 终于......

就是想好看 ⋅ 2017/05/26 ⋅ 0

composer autoload源码分析

现在很多主流框架都用到了composer,包管理实在是方便。现在我就以yii2来举例追踪一遍composer autoload流程 第一步上yii2的web/index.php(入口文件)...

china_lx1 ⋅ 04/21 ⋅ 0

Codeigniter composer 和 __autoload魔术方法冲突解决

废话不多说了,直接看源代码把 CI首先加载的是system/core/Codeigniter.php阅读发现(165行): 果然CI3根目录下的composer.josn不是拿来开玩笑的。在配置文件里,我们同样可以看到是否开启com...

o0无忧亦无怖 ⋅ 2015/11/02 ⋅ 3

Laravel5.2之Composer自动加载

说明:本文主要以Laravel的容器类Container为例做简单说明Composer的自动加载机制。 注:上篇文章基于Laravel Task-Scheduler定时发送邮件小程序聊到本打算接下来聊聊Laravel的设计模式,不过...

botkenni ⋅ 2016/10/21 ⋅ 0

徒手解剖composer,简单了解其实现过程

“composer”?,相信很多做PHP工作的对他并不陌生,他是一个针对第三方库管理工具,解决库与库之间的依赖关系等等等,例如一些yii、laravel等框架都搭载着composer来方便管理第三方包和自身...

Eller ⋅ 2016/11/06 ⋅ 1

Composer自动加载功能

一、安装Composer 这里略过,查看:http://blog.csdn.NET/github26672553/article/details/51759206 二、 1.首选新建一个PHP项目文件夹 2.可以手动写一个composer.json,内容如下: [plain] ...

蜗牛奔跑 ⋅ 2016/11/24 ⋅ 0

Composer - PHP依赖管理

Composer是 PHP 用来管理依赖的工具,提供了科学的第三方包的模块化及更新方案。 运行原理 声明项目依赖 工具前往仓库获取包的元数据信息 工具根据元数据信息前往等代码托管平台获取第三方包...

麦拂沙 ⋅ 2015/10/04 ⋅ 0

探索PHP构造项目之路之停止复制粘贴

当系统有不同的web应用,但是需要共用很多代码怎么办 当系统需要一个扩展功能而这个扩展功能网上刚好有人提供了怎么用 PHP代码如何升级,降级,回滚 如何分配任务,如何让多个工程师一起进行...

周智超 ⋅ 2016/09/21 ⋅ 0

PHP基础学习之SPL Autoload机制

PHP基础学习之SPL Autoload机制 果冻想2018-03-172 阅读 PHP 前言 上一篇文章总结了PHP中的 机制。这一篇是上一篇的姊妹篇。关于 现在基本都被抛弃了,使用的越来越少了,但是语言的发展都是...

果冻想 ⋅ 03/17 ⋅ 0

php composer 自动加载机制的疑惑之处

学习composer机制中,了解到为php项目监理composer配置文件后,会生成vendor/autoload.php文件,此时在入口文件中require vendor/autoload.php就可以实现自动加载 疑问:发现似乎每个文件都需...

陈叙源 ⋅ 2015/07/28 ⋅ 3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部