Composerパッケージ 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の機能の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"
]
}
ファイルの下線は、クラス定義からそれらを区別するために使用される規則であり、オートロードで特別な目的はありません。
Composerはこれらのファイルを特別な方法で処理しません。この場合のパッケージ作成者は、これを、関数を格納するためのある種の慣習として使用しました。
ファイルは、Composerが「ファイル」オートロードとして定義されているために必要です composer.json内 であり、ファイル名の黒魔術のためではありません。