Récemment, j'ai lu des articles sur les espaces de noms et leurs avantages. Je crée actuellement un projet dans Laravel et j'essaie de passer du chargement automatique de mappes de classes à l'espacement de noms. Cependant, je n'arrive pas à comprendre quelle est la différence entre PSR-0 et PSR-4.
Certaines des ressources que j'ai lues sont ...
Ce que je comprends:
Des exemples expliquant la différence seraient appréciés.
Ils sont très similaires, il n’est donc pas surprenant que ce soit un peu déroutant. En résumé, le PSR-0 possédait certaines fonctionnalités de compatibilité ascendante pour les noms de classe de style PEAR abandonnés par le PSR-4, de sorte qu’il ne prend en charge que le code à noms espacés. En plus de cela, le PSR-4 ne vous oblige pas à avoir tout l’espace de nom comme structure de répertoires, mais uniquement la partie qui suit le point d’ancrage.
Par exemple, si vous définissez que l'espace de nom Acme\Foo\
est ancré dans src/
, avec PSR-0, cela signifie qu'il recherchera Acme\Foo\Bar
dans src/Acme/Foo/Bar.php
alors que dans PSR-4 cherchez-le dans src/Bar.php
, permettant ainsi des structures de répertoire plus courtes. D'autre part, certains préfèrent avoir la structure de répertoires complète pour voir clairement en quel espace de nom se trouve, de sorte que vous pouvez également dire que Acme\Foo\
est dans src/Acme/Foo
avec PSR-4, ce qui vous donne l'équivalent de le comportement PSR-0 décrit ci-dessus.
Longue histoire pour les nouveaux projets et pour la plupart des buts et des intentions, vous pouvez utiliser le PSR-4 et oublier le PSR-0.
Voici les principales différences,
1. Par exemple, si vous définissez que l'espace de nom Acme\Foo\
est ancré dans src/
,
Acme\Foo\Bar
dans src/Acme/Foo/Bar.php
Acme\Foo\Bar
dans src/Bar.php(where Bar class is)
.2. Le PSR-4 ne convertit pas les traits de soulignement en séparateurs de répertoires
. Vous préféreriez utiliser PSR-4 avec des espaces de noms
4. PSR-0 ne fonctionnera pas même si le nom de la classe est différent du nom du fichier, comme dans l'exemple ci-dessus:
Acme\Foo\Bar
---> src/Acme/Foo/Bar.php
(pour la classe Bar) fonctionneraAcme\Foo\Bar
---> src/Acme/Foo/Bar2.php
(pour la classe Bar) ne fonctionnera pasPSR-4 est quelque chose comme 'chemin relatif', PSR-0, 'chemin absolu'.
par exemple.
config:
'App\Controller' => 'dir/'
PSR-0 chargement automatique:
App\Controller\IndexController --> dir/App/Controller/IndexController.php
PSR-4 chargement automatique:
App\Controller\IndexController --> dir/IndexController.php
Et il y a quelques différences supplémentaires dans les détails entre PSR-0 et PSR-4, voir ici: http://www.php-fig.org/psr/psr-4/
Convention d'espace de noms/dossier.
Les classes doivent être stockées dans des dossiers en fonction de leurs espaces de noms.
En général, vous créerez un répertoire src/dans votre dossier racine, au même niveau que vendor /, et vous y ajouterez vos projets. Vous trouverez ci-dessous un exemple de la structure du dossier:
.
+-- src
|
+-- Book
| +-- History
| | +-- UnitedStates.php - namespace Book\History;
+-- Vehicle
| +-- Air
| | +-- Wings
| | | +-- Airplane.php - namespace Vehicle\Air\Wings;
| +-- Road
| | +-- Car.php - namespace Vehicle\Road;
+-- tests
+-- test.php
+-- vendor
Différence entre psr-0 et psr-4
psr-
Il est déconseillé. En examinant le fichier vendor/composer/autoload_namespaces.php
, vous pouvez voir les espaces de noms et les répertoires vers lesquels ils sont mappés.
composer.json
"autoload": {
"psr-0": {
"Book\\": "src/",
"Vehicle\\": "src/"
}
}
psr-4
En examinant le fichier vendor/composer/autoload_psr4.php
, vous pouvez voir les espaces de noms et les répertoires vers lesquels ils sont mappés.
composer.json
"autoload": {
"psr-4": {
"Book\\": "src/",
"Vehicle\\": "src/"
}
}
composer.json
"autoload": {
"psr-4": {
"Book\\": "src/Book/",
"Vehicle\\": "src/Vehicle/"
}
}