Récemment, j'ai lu sur les espaces de noms et leurs avantages. Je suis en train de créer un projet dans Laravel et j'essaie de passer du chargement automatique de la carte de classe à l'espace de noms. Cependant, je n'arrive pas à comprendre quelle est la différence réelle entre PSR-0 et PSR-4.
Certaines ressources que j'ai lues sont ...
Ce que je comprends:
- PSR-4 ne convertit pas les traits de soulignement en séparateurs de répertoires
- Certaines règles spécifiques du compositeur rendent la structure de répertoires complexe, ce qui rend verbeux l'espace de noms PSR-0 et donc le PSR-4 a été créé
Des exemples expliquant la différence seraient appréciés.
Réponses:
Ils sont très similaires, il n'est donc pas surprenant que ce soit un peu déroutant. Le résumé est que PSR-0 avait des fonctionnalités de compatibilité descendante pour les noms de classe de style PEAR que PSR-4 a supprimés, en tant que tel, il ne prend en charge que le code à espace de noms. En plus de cela, PSR-4 ne vous oblige pas à avoir tout l'espace de noms en tant que structure de répertoire, mais uniquement la partie suivant le point d'ancrage.
Par exemple, si vous définissez que l'
Acme\Foo\
espace de noms est ancrésrc/
, avec PSR-0, cela signifie qu'il chercheraAcme\Foo\Bar
danssrc/Acme/Foo/Bar.php
tandis que dans PSR-4, il le rechercherasrc/Bar.php
, permettant des structures de répertoire plus courtes. D'un autre côté, certains préfèrent avoir la structure de répertoires complète pour voir clairement dans quel espace de noms, vous pouvez donc également dire queAcme\Foo\
c'estsrc/Acme/Foo
avec PSR-4 qui vous donnera l'équivalent du comportement PSR-0 décrit ci-dessus.Pour faire court pour de nouveaux projets et pour la plupart des intentions, vous pouvez utiliser PSR-4 et oublier tout sur PSR-0.
la source
src/Bar.php
si vous ditesAcme\Foo\ => src/
Voici les principales différences,
1. Par exemple, si vous définissez que l'
Acme\Foo\
espace de noms est ancrésrc/
,Acme\Foo\Bar
danssrc/Acme/Foo/Bar.php
Acme\Foo\Bar
danssrc/Bar.php(where Bar class is)
.2. PSR-4 ne convertit pas les traits de soulignement en séparateurs de répertoires
3. Vous préférez utiliser PSR-4 avec des espaces de noms
4. PSR-0 ne fonctionnera pas même si le nom de classe est différent du nom de fichier, comme en considérant 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 pasla source
PSR-4 est quelque chose comme «chemin relatif», PSR-0, «chemin absolu».
par exemple
config:
Chargement automatique PSR-0 :
Chargement automatique PSR-4 :
Et il y a encore plus de différence dans les détails entre PSR-0 et PSR-4, voir ici: http://www.php-fig.org/psr/psr-4/
la source
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 allez créer un répertoire src / dans votre dossier racine, assis au même niveau que vendeur /, et y ajouter vos projets. Voici un exemple de la structure des dossiers:
Différence entre psr-0 et psr-4
psr-0
Il est obsolète. En regardant le
vendor/composer/autoload_namespaces.php
fichier, vous pouvez voir les espaces de noms et les répertoires auxquels ils sont mappés.composer.json
psr-4
En regardant le
vendor/composer/autoload_psr4.php
fichier, vous pouvez voir les espaces de noms et les répertoires auxquels ils sont mappés.composer.json
composer.json
la source
Même quand j'ai essayé mais Composer est un gâchis. Malheureusement, c'est la seule alternative du marché.
Pourquoi est-ce un gâchis?.
La saisie semi-automatique du compositeur fonctionne correctement si vous contrôlez le code. Cependant, si vous importez un autre projet, vous vous retrouvez avec de nombreux styles et façons de créer des dossiers. Par exemple, certains projets sont /company/src/class.php tandis que d'autres sont company / class.php et d'autres sont company / src / class / class.php
J'ai créé une bibliothèque qui le résout:
https://github.com/EFTEC/AutoLoadOne (c'est gratuit, MIT).
Il génère une auto-inclusion en analysant toutes les classes d'un dossier, il fonctionne donc dans tous les cas (psr-0 psr-4, classes sans espace de noms, fichier avec plusieurs classes ..
edit: Et encore, a voté sans aucune raison. ;-)
la source