簡體   English   中英

Composer 包,自動加載非基於類的文件

[英]Composer packages, autoloading non-class based files

當我在 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 的一個特性,但后來我查看了 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 的此功能的任何有意義的文檔。 它是導出基於非類的命名空間依賴項(如函數和常量)的好“標准”嗎?

更新

我的問題被證明是一個輕微的用詞不當。 選定的答案讓我發現可以顯式聲明非基於類的資產以在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 中被定義為“文件”自動加載,而不是因為文件名上的一些黑魔法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM