web-dev-qa-db-fra.com

Différence entre le PSR-4 et le chargement automatique de classmap?

En ce qui concerne Laravel, j'ai eu une question sur Composer autoloading c'est-à-dire la différence entre "psr-4" et "classmap" autoloading.

1 différence que je sais, c'est que le PSR-4 n'a pas besoin de dumpautoload répété pour chaque modification ou ajout de nouveaux fichiers alors que classmap a besoin de dumpautoload pour chaque modification des fichiers existants contenant des classes ou ajout de nouveau fichier dans répertoire spécifié.

21
RoMo

norme PSR-4 requiert de vous une structure de système de fichiers stricte basée sur des espaces de noms. Supposons que vous ayez une application dans le répertoire src avec l'espace de noms App, tous les sous-espaces de noms refléteront les sous-répertoires et les noms de classe seront les mêmes que les noms de fichiers sans .php extension.

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

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

L'autochargeur "sait" alors où chercher la classe d'un certain nom complet et n'a donc pas besoin de la commande dump-autoload pour flairer les fichiers des classes.

Les problèmes de performances sont ensuite résolus avec composer dump-autoload --optimize-autoloader drapeau, ou -o, qui générera un mappage de classe de la même manière que le chargement automatique de classmap.


D'un autre côté, autochargement de classmap ne nécessite pas que vous ayez presque n'importe quelle structure de fichier ou de répertoire, il passera récursivement par .php et .inc fichiers dans les répertoires et fichiers spécifiés et renifler pour les classes qu'ils contiennent.

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

Ces classes sont ensuite ajoutées à une liste (mise en cache dans un PHP dans le répertoire vendeur/compositeur) qui est utilisée pour le chargement automatique.

Toute nouvelle classe doit alors être ajoutée à cette liste en exécutant composer dump-autoload commande.

41
Finwe