Skip to content

Composer 是 php 依赖包的依赖管理工具,主要用于对项目中使用到的相关扩展包进行管理,并提供了包文件的自动加载能力,它是构建现代化 php 项目的基础工具。在本文中,我们将对自动加载的底层实现进行一次简单的探索。

composer 依赖管理工具的使用要求 php 版本必须大于等于 5.3.2,同时使用 composer 管理加载的代码必须满足 psr-0 或者 psr-4(推荐)的代码自动加载规范。 具体详细的 psr 相关编码规范可以参考连接:psr 相关规范

composer 的文件结构

使用 composer 安装包时会在当前目录下创建 vendor 目录并在 vendor 下创建 composer 目录和 autoload.php 文件。 autoload.php 文件是所有 composer 包自动加载的入口文件。 composer 文件夹下包含 autoload_classmap.php autoload_files.php autoload_namespace.php autoload_psr4.php autoload_real.php autoload_static.php ClassLoader.php installed.json 等文件,是实现类的自动加载的具体实现代码。

autoload_classmap.php

所有 composer 引用组合在使用 composer install 或者 composer update 的过程中被扫描集成到这个文件之中。

也可以用 classmap 生成支持支持自定义加载的不遵循 PSR-0/4 规范的类库。要配置它指向需要的目录,以便能够准确搜索到类文件。

实例:

{
    "autoload": {
        "classmap": ["src/", "lib/", "Something.php"]
    }
}

autoload_file.php

此文件用于指定每次在加载的时候必须要引入的文件,通常要载入的文件都是函数库(而非类库)。

{
    "autoload": {
        "files": ["src/MyLibrary/functions.php"]
    }
}

autoload_namespace.php

此文件是在使用 composer update 或者 composer install 时生成的所有的 psr-0 的引用数组键值对合集。

{
    "autoload": {
        "psr-0": {
            "Monolog\\": "src/",
            "Vendor\\Namespace\\": "src/",
            "Vendor_Namespace_": "src/"
        }
    }
}

如果你需要搜索多个目录中一个相同的前缀,你可以将它们指定为一个数组,例:

{
    "autoload": {
        "psr-0": { "Monolog\\": ["src/", "lib/"] }
    }
}

PSR-0 方式并不仅限于申明命名空间,也可以是精确到类级别的指定。这对于只有一个类在全局命名空间的类库是非常有用的(如果 php 源文件也位于包的根目录)。例如,可以这样申明:

{
    "autoload": {
        "psr-0": { "UniqueGlobalClass": "" }
    }
}

如果你想设置一个目录作为任何命名空间的备用目录,你可以使用空的前缀,像这样:

{
    "autoload": {
        "psr-0": { "": "src/" }
    }
}

autoload_psr-4.php

此文件是在使用 composer update 或者 composer install 是生成的所有的 psr-4 的引用数组键值对合集。

{
    "autoload": {
        "psr-4": {
            "Monolog\\": "src/",
            "Vendor\\Namespace\\": ""
        }
    }
}

如果你需要在多个目录中使用相同的前缀,可以使用数组的形式。

{
    "autoload": {
        "psr-4": { "Monolog\\": ["src/", "lib/"] }
    }
}

使用一个空前缀,你可以在其中查找任意的命名空间。

{
    "autoload": {
        "psr-4": { "": "src/" }
    }
}

autoload_static.php

此文件是在使用 composer 1.1.0 开始使用的针对 php5.6 以上版本的,做的静态加载优化。

ClassLoader.php

此文件时 composer 文件自动加载的业务的具体实现处理方法。

installed.json

此文件时所有 composer 的安装包以及 composer 安装包的依赖的合集。

composer 常用命令

composer dump-autoload 重建 composer 所建立的映射关系

composer dump-autoload --optimize 重建映射关系 并优化自动加载(可以提高自动加载的性能,主要是将符合 psr-0 和 psr-4 自动加载到 autoload_calssmap 中)