web-dev-qa-db-ja.com

PSR-4とクラスマップのオートローディングの違いは?

Laravelに関して、Composer自動ロード、つまり「psr-4」と「クラスマップ」自動ロードの違いについての質問がありました。

私が知っている1つの違いは、PSR-4は新しいファイルの変更または追加ごとにdumpautoloadを繰り返す必要がないのに対し、クラスマップはクラスを含む既存のファイルのすべての変更または新しいファイルの追加のためにdumpautoloadを必要とすることです。指定されたディレクトリ。

21
RoMo

PSR-4標準名前空間に基づく厳密なファイルシステム構造が必要です。 srcディレクトリにApp名前空間のあるアプリがあるとすると、すべてのサブ名前空間はサブディレクトリをミラーリングし、クラス名は.php拡張子のないファイル名と同じになります。

{
    "autoload": {
        "psr-4": { "App\\": "src/" }
    }
}

src/
    Foo/
        Bar.php <---- App\Foo\Bar class
    Baz.php <---- App\Baz class

次に、オートローダーは、特定の完全修飾名のクラスを探す場所を「認識」しているため、クラスのファイルをスニッフィングするためにdump-autoloadコマンドを必要としません。

次に、composer dump-autoload --optimize-autoloaderフラグまたは-oを使用してパフォーマンスの問題を解決します。これにより、クラスマップの自動読み込みと同様の方法でクラスマップが生成されます。


一方、classmap autoloadingでは、特定のファイルまたはディレクトリ構造をほとんど必要とせず、指定されたディレクトリおよびファイル内の.phpおよび.incファイルを再帰的に通過します。それらのクラスを嗅ぐ。

{
    "autoload": {
        "classmap": ["src/", "lib/", "Something.php"]
    }
}

これらのクラスは、オートロードに使用されるリスト(PHPファイルにキャッシュされる))に追加されます。

次に、composer dump-autoloadコマンドを実行して、新しいクラスをそのリストに追加する必要があります。

41
Finwe