当我在github上挖掘Composer包的源代码时,我注意到有一些php文件与命名空间名称匹配,但前面有一个下划线。困惑的我(通过 Composer(将包拉下来,并注意到 Composer 生成的类加载器显式地require
这些带下划线的文件,而不是像我预期的那样自动加载。
例如,在crunch/regular-expression
包中,有一个名为 CrunchRegularExpression
:
-- src
---- Crunch
------- RegularExpression <-- folder containing classes
------- _RegularExpression.php <-- file namespace to Crunch/RegularExpression
containing functions and constants
(instead of a class)
最初,我认为这些带下划线的文件是我错过的PSR-0功能,但后来我查看了作曲家生成的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"
]
}
文件上的下划线是用于从类定义中描述它们的约定,在自动加载中没有特殊用途。
Composer 不会以任何特殊方式处理这些文件。在这种情况下,包作者将其用作某种约定来存储它看起来的函数。
这些文件是Composer所必需的,因为它们在composer.json中被定义为自动加载的"文件",而不是因为文件名上的一些黑魔法。