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

时间:2013-04-29 07:55:48

标签: php namespaces composer-php

当我深入研究Composer包on github的来源时,我注意到有 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的一个功能,但后来我查看了生成autoload_real.php的Composer,并看到明确要求_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 个答案:

答案 0 :(得分:19)

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

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