web-dev-qa-db-fra.com

Quelles sont les différences entre PSR-0 et PSR-4?

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:

  • Le PSR-4 ne convertit pas les traits de soulignement en séparateurs de répertoires
  • Certaines règles spécifiques de composer entraînent la complexification de la structure de répertoires, ce qui rend la lecture de noms PSR-0 verbeuse et crée ainsi le fichier PSR-4.

Des exemples expliquant la différence seraient appréciés.

207
Varun Nath

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.

262
Seldaek

Voici les principales différences,

1. Par exemple, si vous définissez que l'espace de nom Acme\Foo\ est ancré dans src/,

  • avec PSR-0 cela signifie qu'il va rechercher Acme\Foo\Bar dans src/Acme/Foo/Bar.php
  • dans le PSR-4, il recherchera 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) fonctionnera
  • Acme\Foo\Bar ---> src/Acme/Foo/Bar2.php (pour la classe Bar) ne fonctionnera pas
40
Adil Abbasi

PSR-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/

25
wbswjc

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/"
        }
} 
  • Recherche de Livre\Histoire\Etats-Unis en src/Livre/Histoire/UnitedStates.php
  • Vous cherchez véhicule\Air\Ailes\Avion dans src/Véhicule/Air/Ailes/Avion.php

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/"
    }
}   
  • Recherche de Livre\Histoire\États-Unis en src/Histoire/UnitedStates.php
  • Vous cherchez véhicule\Air\Ailes\Avion dans src/Air/Ailes/Avion.php

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/Book/",
        "Vehicle\\": "src/Vehicle/"
    }
}    
  • Recherche de Livre\Histoire\États-Unis src/Livre/Histoire/États-Unis.php
  • Vous cherchez véhicule\Air\Ailes\Avion dans src/Véhicule/Air/Ailes/Avion.php
7
Udhav Sarvaiya