24

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

例如,在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 的一个特性,但后来我查看了生成的 Composerautoload_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"
    ]
}

文件上的下划线是用于从类定义中描述它们的约定,并且在自动加载中没有特殊用途。

4

1 回答 1

21

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

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

于 2013-04-29T08:40:05.233 回答