Composer 中的自动加载

简介

对于文件的自动加载,Composer 生成了一个 vendor/autoload.php 文件。你可以简单的引入这个文件,就会得到自动加载的支持。

require 'vendor/autoload.php';

这使得你可以很容易的使用第三方代码。

例如,如果你的项目依赖 monolog,你通过 composer 安装了 monolog 之后,就可以直接在其他文件中使用 monolog 类库,它们都会被自动加载。

自动加载的类型

composer 支持多种 autoloader ,它们都是在 composer.json 文件的 autoload 中进行配置。

如果你想要在项目中添加自己的 autoloader,请在项目目录的 composer.json 文件中进行配置。

composer 支持的 autoloader 的类型主要有 psr-4、psr-0、classmap 和 files 。

注意:每次添加的新的 autoloader 时,需要执行 composer dumpautoload 命令,来让 autoloader 立即生效。

psr-4

psr-4 类型的 autoloader 必须遵循 psr-4 自动加载规范。

"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Acme\\": "src/"
    }
},

说明: "App\\": "app/" 是项目中本来就有的,"Acme\\": "src/" 是我们自己添加的。

命名空间的声明应该以 \\ 结束,以确保 autoloader 能够准确映射到实际的路径。

Composer 将注册一个 PSR-4 autoloader 到 Acme 命名空间,该命名空间所映射的目录就是项目根目录中的 src 目录。(src 文件夹 与 vendor 文件夹同级)

这样,你就在项目根目录中,注册了一个新的根命名空间 Acme。该命名空间下所有遵循 psr-4 规范的文件,就都有了自动加载的支持。

psr-0

psr-0 类型的 autoloader 需要遵循 psr-0 规范或者 psr-4 规范。

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

psr-0 规范,采用的是 PEAR 风格的约定,与命名空间不同,PEAR 类库在类名上采用了下划线分隔。

php-fig 组织不赞成使用 psr-0 自动加载规范,而改用 psr-4。也就是说 psr-4 已经取代了 psr-0。

目前,绝大多数的第三方包都是采用 psr-4 自动加载规范。

classmap

classmap 类型的 autoloader,无需遵循 psr-0 和 psr-4 规范。

如果你想对没有定义命名空间的目录或者文件,也添加自动加载的支持。就可以使用 classmap 类型的 autoloader 。

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

files

files 类型的 autoloader,专门用来自动加载单个文件,也无需遵循 psr-0 和 psr-4 规范。

files 类型的 autoloader 常用来加载辅助函数文件。

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

autoload-dev

autoload-dev 代码块,用于定义开发环境中专用的 autoloader。

对于仅用于开发环境的自动加载规则(autoloader),推荐写到 autoload-dev 代码块中。

比如,常见的测试用例等等。

{
    "autoload": {
        "psr-4": { "MyLibrary\\": "src/" }
    },
    "autoload-dev": {
        "psr-4": { "MyLibrary\\Tests\\": "tests/" },
        "classmap": [ "tests/TestCase.php"]
    }
}

猜你喜欢

转载自blog.csdn.net/lamp_yang_3533/article/details/80261059