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

标签 php namespaces composer-php

当我在挖掘 Composer 包的来源时 on github我注意到有些 php 文件与命名空间名称匹配,但前面带有下划线。困惑我拉下包(通过 Composer)并注意到 Composer 生成的类加载器 require d 这些带下划线的文件明确显示,而不是像我预期的那样自动加载。
例如,在 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 的一个特性,但后来我查看了 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 的此功能的任何有意义的文档。它是导出基于非类的命名空间依赖项(如函数和常量)的好“标准”吗?
更新
结果证明我的问题有点用词不当。选择的答案让我发现可以显式声明非基于类的 Assets 以在 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 需要这些文件,因为它们被定义为"file"自动加载 in the composer.json ,不是因为文件名上的一些黑魔法。

关于php - Composer 包,自动加载非基于类的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48633300/

相关文章:

c# - 引用程序集后无法使用命名空间

namespaces - 包/命名空间的 TypeScript 命名约定是复数还是单数?

ssh - Satis - ssh2.sftp 协议(protocol)出错

php - 如何安装 Laravel 5.0

PHP 代码在本地服务器上工作,但在域上不起作用

php字符串转数组结构

php - 扫描整个网站的页面以查找一段代码

php - 使用未定义的常量字符串 - 从变量调用类名时假定为 'String'

php - Travis CI 构建 PHP 项目并从 Composer 中提取依赖项,尝试使用 git@ 而不是 https

php - .htaccess 中定义的操作不执行