composer的四种自动加载

PHP 阅读: 357

composer中可以配置四种自动加载规则,你可能会熟知其中的一两种,但可能不知道有四种吧?不知道的一起来随我学习吧。

psr-4 自动加载

psr-4是目前最新的、最受欢迎的、广泛在各种composer包、PHP框架中使用的自动加载方式。

我这里不说明psr-4的加载规则了,因为官方文档比我说明的更规范、更清楚,如果不知道psr-4可以查看文章末尾的参考文章。

这里只说明怎么在composer.json中配置psr-4自动加载规则:

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

autoload对象里面即为所有自动加载规则,包含psr-4和下面要介绍的三种。

psr-4对象里面为多个键值对,每个键值对配置一个psr-4加载规则:

  • 键: 基础命名空间名字,并且以\\结束(用两个反斜杠是为了转义),如果为空则表示全局命名空间(不要使用"\\"表示全局命名空间)。
  • 值: 该基础命名空间对应的基目录(基目录为相对路径,相对于项目根目录),并且以目录分割符/结束,如果为空或者"./"则表示当前项目根目录。

如果一个基础命名空间对应多个基目录,那么可以将多个基目录放在一个数组里面:

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

还可以将基础命名空间设置为空(不要使用"\\"表示全局命名空间),这样全局命名空间便对应于指定的目录:

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

修改了autoload字段后我们需要使用执行composer的dump-autoload命令使之生效(每次修改都要重新执行):

composer dump-autoload

执行后我们可以在vendor/composer/autoload_psr4.php文件中查看所有生成的psr-4规则。

psr-0 自动加载

psr-0是psr-4的前身,因为有缺陷而被psr-4代替了,现在已经被废弃了,不推荐使用。但是有些composer包(历史原因)还有用到,所以了解一下也是有必要的。

具体的psr-0说明可以看文章末尾的参考文章。

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

psr-0的配置方法基本和psr-4相同,不同的是:每个psr-0规则的键值对的中,“值”不是指基础命名空间对应的基目录,而是指包含该基础命名空间的父目录!父目录这一点也是psr-0的缺陷,如果不明白为什么可以做做实验。

psr-0 生成的规则我们可以在vendor/composer/autoload_namespaces.php文件中查看。

classmap 自动加载

classmap 自动加载在psr规范里面并没有,是composer自己加的一种加载规则。

你可以指定一些要搜索的类文件目录或者具体类文件路径,执行composer的dump-autoload命令后,会自动扫描这些目录下的类文件和具体类文件,生成一个类名到类文件路径的映射表,这也是叫classmap的原因。

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

classmap是一个数组(注意不是对象也不是一个字符串),每个元素指定一个类文件搜索目录或者直接指定一个类文件路径。

classmap 生成的规则我们可以在vendor/composer/autoload_classmap.php文件中查看。

files 自动加载

files 自动加载在psr规范里面没有,也是composer自己加的。

files 自动加载相对来说就比较简单了,你可以指定一些php文件,这些文件每次总是会被载入,而不管有没有用到里面的类。一般用来载入经常使用的函数库文件:

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

files是一个数组(注意不是对象也不是一个字符串),每个元素指定一个需要加载的php文件路径。

files 生成的规则我们可以在vendor/composer/autoload_files.php文件中查看。

参考文章

  1. composer.json 架构 | Composer 中文文档 | Composer 中文网
  2. PSR-0 自动加载规范(已弃用) |《PHP PSR 标准规范》| PHP 技术论坛
  3. 「PSR 规范」PSR-4 自动加载规范 | Laravel China 社区

版权声明:本文为博主原创文章,转载需注明来自: 洛洛の空间