web-dev-qa-db-ja.com

Composerパッケージ、クラスに基づかないファイルの自動読み込み

Composerパッケージ github上 のソースを掘り下げていたとき、名前空間名に一致するphpファイルがあることに気付きましたですが、アンダースコアが前に付いていました。困惑しました(Composerを介して)パッケージをプルダウンし、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の機能の1つであると私は見逃していたと思いましたが、次に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"
    ]
}

ファイルの下線は、クラス定義からそれらを区別するために使用される規則であり、オートロードで特別な目的はありません。

22
Mark Fox

Composerはこれらのファイルを特別な方法で処理しません。この場合のパッケージ作成者は、これを、関数を格納するためのある種の慣習として使用しました。

ファイルは、Composerが「ファイル」オートロードとして定義されているために必要です composer.json内 であり、ファイル名の黒魔術のためではありません。

19
Seldaek