在深入研究Composer包论github的源代码时,我注意到有些php文件与名称空间名称相匹配,但前面有一个下划线。我迷惑不解地拉下了包(通过Composer),并注意到编写器生成required的类加载器显式地生成了这些突出显示的文件,而不是像我预期的那样自动加载。
例如,在crunch/regular-expression包中有一个名为Crunch\RegularExpression的命名空间
-- 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"
]
}文件上的下划线是一种惯例,用来将它们从类定义中描述出来,并且在自动标注中没有特殊的用途。
发布于 2013-04-29 08:40:05
作曲家不以任何特殊的方式对待这些文件。在本例中,包作者将此用作存储函数的某种约定。
这些文件是由Composer要求的,因为它们被定义为“file”autoload 在composer.json中,而不是因为文件名上的一些黑魔法。
https://stackoverflow.com/questions/16273746
复制相似问题