yii2框架-composer的自动加载(二)

2023-11-07

Composer作为php包的管理工具,可以整合很多的优秀的php库资源,进行共享,可以在https://packgist.org上搜索到很多我们开发中需要的库。下面我们将了解一下composer的自动加载的原理。

Composer 不是一个包管理器。是的,它涉及 "packages" 和"libraries",但它在每个项目的基础上进行管理,在你项目的某个目录中(例如 vendor)进行安装。默认情况下它不会在全局安装任何东西。因此,这仅仅是一个依赖管理。

这种想法并不新鲜,Composer 受到了 node's npm 和 ruby's bundler 的强烈启发。而当时 PHP 下并没有类似的工具。

Composer 将这样为你解决问题:

a) 你有一个项目依赖于若干个库。

b) 其中一些库依赖于其他库。

c) 你声明你所依赖的东西。

d) Composer 会找出哪个版本的包需要安装,并安装它们(将它们下载到你的项目中)。



(1)安装composer

a)linux系统安装
你只需要下载 composer.phar 可执行文件
要检查 Composer 是否正常工作,只需要通过 php 来执行 PHAR:

php composer.phar

提示:此方法同样适用于windows系统安装

b)windows安装
下载并且运行 Composer-Setup.exe,它将安装最新版本的 Composer ,并设置好系统的环境变量,因此你可以在任何目录下直接使用 composer 命令。

c)使用 Composer
在我们的项目的根目录下,建立一个composer.json文件,里面有所需要的一些信息和所依赖的库
在这里就不在详细说明了。

配置好composer.json文件后,进入到项目的根目录下执行php composer.phar install 就可以执行初始化composer,把所要依赖的类库下载下来,会产生一个vendor文件夹,一个composer.lock锁文件,以后每次依赖下载的类库都会放在vendor的文件夹下。

d)分析vendor中的文件
vendor文件夹中包含composer文件夹,依赖的各种类库文件夹,一个autoload.php文件。

其中autoload.php文件是一个自动加载类,只要在一个文件中包含这个文件就可以通过命名空间的方式实现自动的加载功能,把需要的vendor中文件包含进去之后,再创建实例。
例如:

//根据路径将vendor下的autoload.php包含

require 'path/to/vendor/autoload.php' 

new \kucha\ueditor\UEditor([]);

那么这个过程将会发生什么,整个原理又是怎么样的?
下面分析一下:
在vendor/composer文件夹下有4个aotoload_*.php的文件和一个ClassLoader.php
其中autoload_real.php类实现一个php的自定义autoload的加载函数。

autoload_real.php具体代码:

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

        spl_autoload_register(array('ComposerAutoloaderInit32b8eb537f8e12e57c5e7bade69d01f0', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
        spl_autoload_unregister(array('ComposerAutoloaderInit32b8eb537f8e12e57c5e7bade69d01f0', 'loadClassLoader'));

        //.......其他代码
        /**
        *
        */
        $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);
        }

        /**
        *注册一个自定义加载函数,在ClassLoader.php函数中
        *
		    public function register($prepend = false)
		    {
		        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
		    }
        *
        */
        参数为true,代表把loadClass()放置堆栈之首
        $loader->register(true);

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

        return $loader;
	}
}

当require 'path/to/vendor/autoload.php'文件时,就会执行getLoader()这个函数,这个函数通过spl_autoload_register函数自定义自动加载函数,注册loadClassLoader()函数。所以当self::$loader = $loader = new \Composer\Autoload\ClassLoader();将ClassLoader.php包含进来,并创建一个$loader实例。由于$loader实例是一个static(静态)的变量对象,所以会缓存在整个过程中,所以spl_autoload_unregister()将从spl的堆栈中移除loadClassLoader()加载函数,因为它的任务已经完成,就是产生并且缓存一个$loader的对象。

然后$loader对象可以执行里面的各种函数,prs0,classMap,prs4,includepath的自动加载规则,把命名空间和对应的实际路径设置好,同时通过$loader->register(true)注册一个loadClass()的自动加载函数,并放在spl堆栈的首位,所以在文件中new \kucha\ueditor\UEditor([])时,代码就会到spl堆栈中找到loadClass()函数,然后将根据命名空间去寻找对应的文件包含,最后创建一个实例。所以在开发的整个过程中,我们很多时候不在需要通过include或者require去包含一个文件,然后再创建实例,而是利用composer创建好的规则,直接new namespace 的方式就可以轻松完成整个过程,创建实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

yii2框架-composer的自动加载(二) 的相关文章

随机推荐

  • SpringBoot2学习笔记

    信息来源 https www bilibili com video BV19K4y1L7MT p 5 vd source 3969f30b089463e19db0cc5e8fe4583a 作者提供的文档 https www yuque co
  • 微信小程序的socket.io即时通讯开发(基于E聊SDK)

    1 背景 由于微信小程序需要开发轻量 跨平台 开发时间短等特点 许多公司将小程序作为了业务展示的第一个APP E聊客户端核心SDK 通讯部分已适配了微信小程序平台 下面分享一下适配过程中的思路与方法 2 分析 微信小程序接入要求 微信小程序
  • openpcdet环境配置

    版本确定 驱动 cuda cudnn cuda与cudnn 官方 安装文档 https docs nvidia com cuda cuda installation guide linux index html runfile instal
  • 实例分割:Mask RCNN

    Mask RCNN 学习目标 说明Mask RCNN的结构特点 掌握Mask RCNN的RoIAlign方法 掌握Mask RCNN的mask原理 知道Mask RCNN的损失函数 上图是MaskRCNN预测的结果 Mask RCNN流程
  • Shader与ShaderToy开篇

    写在前面 Unity从学习到工作至今已经有三个年头了 开发中每次遇到难点第一件事就是百度搜索 从来没有自己的想法 甚是惭愧 想着不能再这样浑浑噩噩下去了 也决定开个博客 记录一下开发中自己觉得有用的东西 希望日后某一天回顾起来不会觉得日子白
  • 操作系统学习(1)

    1 进程的模式有系统态 管态 和用户态 目态 两种 一般用户编写的程序是在用户态下工作 当程序中有中断或者调用系统函数时 会切换到系统态下运行 2 当CPU处于管态时 可以执行的指令是 计算机系统中的全部指令 分析 管态又叫特权态 系统态或
  • 区块链23问,你想知道的都在这里了

    本文将以一问一答的方式给大家送上一篇关于区块链的科普文 区块链是比特币吗 金融领域为什么要使用区块链技术 所有的区块链都需要挖矿吗 区块链和大数据什么关系 这些问题本文将会一一解答 前方高能 问 什么是区块链 答 区块链 Blockchai
  • Apache 原生 Hadoop 运维命令

    Hadoop 1 检查原生hadoop和压缩库是否可用 hadoop checknative 2 打印hadoop环境的配置路径 hadoop classpath HDFS 1 查看hdfs文件系统的状态 hdfs dfsadmin rep
  • 我的创作纪念日2022

    起因 最初是当作自己的C语言电子笔记本来用的 记录一些做题的时候的理解 后来发现自己的文章可以帮助到一些一起学习的朋友就开始逐步写的通俗易懂 再到后来看到B站稚晖君的一些视频 以及结合自己的专业 开始了对嵌入式的学习 以及分享一些自己学习的
  • 我所不知道的TCP Socket编程(三)-服务器生命周期

    三 服务器生命周期 服务器套接字用于侦听连接而非发起连接 其典型的生命周期如下 1 创建 2 绑定 3 侦听 4 接受 5 关闭 创建已经在第一节中介绍完了 继续其余部分 3 1 服务器绑定 服务器生命周期中的第二步是绑定到监听连接的端口上
  • 无需下载任何软件!BurpSuite如何抓取iphone数据包

    一 手机电脑处于同一个网段下 此处我的手机和电脑都处在X X 1 X网段下 二 BurpSuite设置 添加代理 手机端配置代理 配置完点击存储 三 手机导入证书文件 手机端在Safari浏览器输入 电脑端ip 8080 允许 在设置里打开
  • springboot中多环境配置

    1 主要在pom xml中做配置 如下
  • QT开发之串口通信(四)

    VS2015 QtPackage版本1 3 11插件 QT5 13 1 最近使用串口遇到一些问题 1 问题 在上述编译环境下发生数据会出现发送一次数据后无法重复发送数据 返回值也没有问题 查询得知 QByteArray SendBytes
  • Python第五次作业

    1 设计一个Group类 在该类中包括 一个数据成员 每个学生的分数 两个类成员total 班级的总分 和count 班级的人数 成员方法setScore score 用于设置分数 成员方法sum 用于累计总分 类方法 average 用于
  • glibc下malloc与free的实现原理(三):free函数的实现

    glibc下malloc与free的实现原理 三 free函数的实现 一 概述 在之前对malloc的分析中 我们实际上大概对free所要进行的工作有了一点模糊的感觉了 这一节 我们将通过分析free函数相关源代码来搞清楚free的具体机制
  • TB_1

  • k8s的yaml文件管理

    声明式管理方法 1 适合于对资源的修改操作 2 声明式资源管理方法依赖于资源配置清单文件对资源进行管理 资源配置清单文件有两种格式 yaml 人性化 易读 json 易于api接口解析 3 对资源的管理 是通过事先定义在统一资源配置清单内
  • vue中上传文件之multipart/form-data

    首先在项目里用了拦截器的 由于拦截器会将传递的参数转成对象 所以你i提交的时候会发现multipart form data或转变成application json 其次关于input的文件上传是需要一个非常纯净的axios的 于是我就在ma
  • is_base_of

    is base of 如何工作 How does is base of work C C IT屋 2016 10 11 20 27 02 百度翻译此文 有道翻译此文 问 题 How does the following code work
  • yii2框架-composer的自动加载(二)

    Composer作为php包的管理工具 可以整合很多的优秀的php库资源 进行共享 可以在https packgist org上搜索到很多我们开发中需要的库 下面我们将了解一下composer的自动加载的原理 Composer 不是一个包管