composer工作原理与实践

简介:本文主要介绍composer下载安装,composer初始化项目或者创建sdk包,composer镜像切换,composer安装更新删除依赖以及文件自动加载等

首先介绍一下什么是composer?它是PHP用来管理依赖关系的工具,在自己项目中通过composer声明所依赖的外部工具库,composer帮助你安装这些依赖库文件。在使用composer之前请大家先安装,不会的朋友可以直接进入composer官方下载安装页面根据提示安装

我们来看看composer基本使用及相关命令的作用吧?

1.首先初始化配置文件:

composer init

初始化composer需要填写的信息

Package Nmae:当前项目包的名称(格式:github账号名称/SDK名称)

Description:当前项目的简介

Author:所属作者(格式:作者名 <邮箱>)

Minimum Stability:stable(稳定)、dev(开发包)、alpha、RC、beta

Package Type:项目类型(library:代表当前项目为一个SDK插件,project:完整的项目,例如框架)

License:许可协议(Apache-2.0,MIT等协议,可以自己随便填)

require:当前项目是否需要依赖其他的插件库,没有可以填no

require-dev:是否为开发版本(yes或no)

composer初始化之后会在项目根目录下生成一个composer.json文件。里面都是初始化时定义的参数,当然composer参数有很多,初始化只是设置了必要的参数。

为了方便别人搜索到你的项目,我们还可以在composer.json文件中定义项目的关键字。官方有更为详细的说明,需要可以进入composer架构页面查看

2.切换composer镜像源

# 通过composer命令切换镜像源
composer config repo.packagist composer https://packagist.phpcomposer.com

上述命令执行之后会在composer.json文件中添加如下配置信息

"repositories": {
    "packagist": {
        "type": "composer",
        "url": "https://packagist.phpcomposer.com"
    }
}

所以我们也可以直接修改composer.json文件来切换镜像源,只要把上面的配置信息修改即可。

3.安装项目依赖库及composer相关代码

composer install

安装完成后项目目录 结构如下所示:

4.安装第三方SDK

composer require SDK名称

执行上述命令后会自动修改composer.json文件,添加require配置选项并且更新composer.lock文件(如果composer.lock文件不存在自动新增),如下所示:

"require": {
    "SDK名称": "SDK的版本"
}

5.更新第三方SDK

# 更新所有SDK
composer update
# 更新某个SDK
composer update SDK名

关于第三方SDK库,大家可以在PHP包存储库中搜索

6.删除某个扩展

composer remove 扩展名

例如:composer remove khanamiryan/qrcode-detector-decoder

7.某个文件或者类的自动加载

实现文件自动加载需要修改composer.json文件,添加如下配置信息

{
    "autoload":{
        "files":["需要自动加载的文件路径"]
    }
}

修改composer.json文件之后需要使用:composer dump 命令使其生效

实现类的自动加载也需要修改composer.json文件,在autoload配置项下面添加psr-4配置信息

{
    "autoload":{
        "files":["需要自动加载的文件路径"],
        "psr-4":{
            "命名空间":"该命名空间对应的目录"
        }
    }
}

命名空间格式:app\\home\\

注意修改完之后记得使用 composer dump 使其生效

上面的操作完成之后只需要在自己项目的入口文件中添加如下代码就可以在任何地方使用文件中的函数或者类。

// 加载composer自动加载文件
require_once 'vendor/autoload.php';

如果你使用的是框架,无需引入。大部分框架已经引入该文件,可以直接使用composer所有功能。

我们已经学习了composer基本操作,可是composer是如何实现自动加载的呢?composer在autoload.php文件中做了什么操作让框架可以实现自动加载的呢?

PHP有一个特殊的函数(spl_autoload_register)用于实现自动加载。下面我们来看一段PHP代码,看看类的自动加载原理

首先我们创建一个User类

<?php
​
class User {
}

然后我们再来看看类的自动加载原理:

<?php
/**
 * 参数一:当我们在使用一个不存的类时回调的函数
 * 参数二:回调或者注册类到队列时报错,是否抛出异常
 * 参数三:是否将aotoload注册的函数加载到队列中
 */
spl_autoload_register('autoload',true,true);
​
/**
 * 自定义的类的加载方法,给spl_autoload_register回调使用
 * 参数:类的名称 
 */
function autoload($className){
  echo '需要自动加载的类名称:' . $className;
  include './' . $className . '.php';
}
​
new User();

上述代码运行后打印的结果如下:

需要自动加载的类名称:User

上面打印结果可以看出,当我们使用一个不存在的类时PHP会调用spl_autoload_register注册的回调函数。我们在回调函数中再去加载这个不存在的类。这就是composer自动加载最基础的原理。有兴趣的朋友可以去看看vendor下composer相关的源码。

有遗漏或者不对的可以在我的公众号留言哦

编程经验共享公众号二维码

编程经验共享公众号二维码
更多内容关注公众号
Copyright © 2021 编程经验共享 赣ICP备2021010401号-1