Composer 包,自动加载非基于类的文件

2022-08-30 17:53:02

当我在github上挖掘Composer包的源代码时,我注意到有些php文件与命名空间名称匹配,但前面有一个下划线。困惑的是,我(通过Composer)拉下包,并注意到Composer生成的类加载器显式地处理了这些带下划线的文件,而不是像我预期的那样自动加载。require

例如,在包中有一个名为:crunch/regular-expressionCrunch\RegularExpression

-- src
---- Crunch
------- RegularExpression       <-- folder containing classes
------- _RegularExpression.php  <-- file namespace to Crunch/RegularExpression
                                    containing functions and constants 
                                    (instead of a class)

最初,我认为这些带下划线的文件是我错过的PSR-0的一个功能,但后来我查看了生成的Composer,发现(以及其他文件)是明确要求的:autoload_real.php_RegularExpression.php

…
$loader->register(true);

require $baseDir . '/src/Crunch/_RegularExpression.php';
require $baseDir . '/src/Crunch/RegularExpression/_Modifier.php';
require $baseDir . '/src/Crunch/RegularExpression/Pattern/_Modifier.php';
require $baseDir . '/src/Crunch/RegularExpression/Pattern/_Assertion.php';

return $loader;
…

无法找到有关 Composer 此功能的任何有意义的文档。对于导出非基于类的命名空间依赖项(如函数和常量)来说,它是否是一个很好的“标准”?

更新

事实证明,我的问题有点用词不当。选择的答案使我发现非基于类的资产可以显式声明为在中加载:composer.json

"autoload": {
    "psr-0": { "Crunch\\RegularExpression": "src" },
    "files": [
        "src/Crunch/_RegularExpression.php",
        "src/Crunch/RegularExpression/_Modifier.php",
        "src/Crunch/RegularExpression/Pattern/_Modifier.php",
        "src/Crunch/RegularExpression/Pattern/_Assertion.php"
    ]
}

文件上的下划线是用于将它们与类定义区分开来的约定,在自动加载中没有特殊用途。


答案 1

Composer 不会以任何特殊方式处理这些文件。在这种情况下,包作者将其用作某种约定来存储它似乎的函数。

Composer 之所以需要这些文件,是因为它们在 composer.json 中被定义为“files”自动加载,而不是因为文件名上有一些黑魔法。


答案 2

推荐