Quali sono le differenze tra PSR-0 e PSR-4?


225

Di recente ho letto degli spazi dei nomi e di come sono utili. Attualmente sto creando un progetto in Laravel e sto provando a passare dal caricamento automatico delle mappe di classe allo spazio dei nomi. Tuttavia, non riesco a capire quale sia la differenza effettiva tra PSR-0 e PSR-4.

Alcune risorse che ho letto sono ...

Quello che ho capito:

  • PSR-4 non converte i caratteri di sottolineatura in separatori di directory
  • Alcune regole specifiche del compositore rendono complessa la struttura delle directory che a sua volta rende verboso lo spazio dei nomi PSR-0 e quindi PSR-4 è stato creato

Gli esempi che spiegano la differenza sarebbero apprezzati.


3
Leggi PSR0 e PSR4 . Spiegano ogni singolo dettaglio.
Sverri M. Olsen,


4
☝️ Qualcuno dovrebbe scrivere l'essenza di questo come una risposta ... :)
ingannare

1
IMO, la maggior parte delle parti in PSR riguarda ciò che NON PIACE e ciò che è GIUSTO ...
Yousha Aleayoub

Risposte:


283

Sono molto simili, quindi non sorprende che sia un po 'confuso. Il riassunto è che PSR-0 aveva alcune caratteristiche di retrocompatibilità per i nomi di classe in stile PEAR che PSR-4 ha lasciato cadere, in quanto tale supporta solo il codice spaziato. Inoltre PSR-4 non ti obbliga ad avere l'intero spazio dei nomi come struttura di directory, ma solo la parte che segue il punto di ancoraggio.

Ad esempio, se si definisce che lo Acme\Foo\spazio dei nomi è ancorato src/, con PSR-0 significa che cercherà Acme\Foo\Barin src/Acme/Foo/Bar.phpmentre in PSR-4 lo cercherà src/Bar.php, consentendo strutture di directory più brevi. D'altra parte alcuni preferiscono avere la struttura di directory completa per vedere chiaramente cosa c'è in quale spazio dei nomi, quindi puoi anche dire che Acme\Foo\è in src/Acme/FooPSR-4 che ti darà l'equivalente del comportamento PSR-0 sopra descritto.

Per farla breve per nuovi progetti e per la maggior parte degli scopi, puoi usare PSR-4 e dimenticare tutto su PSR-0.


17
Esso raccoglie src/Bar.phpse si diceAcme\Foo\ => src/
Seldaek

Grazie mille per la spiegazione!
尤川豪

4
La PSR-4 è più lenta della PSR-0, no?
Nguyen Linh,

2
@NguyenLinh Non credo. Fa la stessa cosa, ma probabilmente con meno livelli di directory, quindi potrebbe essere un po 'più veloce. Misuralo. Puoi creare un pacchetto che puoi cambiare tra PSR-0 e PSR-4 - Non credo che vedrai una differenza.
Sven,

44

Ecco le principali differenze,

1. Ad esempio, se si definisce che lo Acme\Foo\spazio dei nomi è ancorato src/,

  • con PSR-0 significa che cercherà Acme\Foo\Barinsrc/Acme/Foo/Bar.php
  • mentre in PSR-4 cercherà Acme\Foo\Barin src/Bar.php(where Bar class is).

2. PSR-4 non converte i caratteri di sottolineatura in separatori di directory

3. Preferiresti usare PSR-4 con spazi dei nomi

4. PSR-0 non funzionerà anche se il nome della classe è diverso dal nome del file, come nell'esempio sopra riportato:

  • Acme\Foo\Bar ---> src/Acme/Foo/Bar.php (per la classe Bar) funzionerà
  • Acme\Foo\Bar ---> src/Acme/Foo/Bar2.php(per la classe Bar) non funzionerà

1
Sicuramente puoi usare PSR-4 insieme a nessun script dello spazio dei nomi, non esiste una tale restrizione e io la uso (non la mia scelta)
Galvani

Nel tuo 1. (primo punto) da dove viene Bar per il caso PSR-4?
giocherellando il

31

PSR-4 è qualcosa come "percorso relativo", PSR-0, "percorso assoluto".

per esempio

config:

'App\Controller' => 'dir/'

Caricamento automatico PSR-0 :

App\Controller\IndexController --> dir/App/Controller/IndexController.php

Caricamento automatico PSR-4 :

App\Controller\IndexController --> dir/IndexController.php

E ci sono alcune differenze nei dettagli tra PSR-0 e PSR-4, vedi qui: http://www.php-fig.org/psr/psr-4/


10

Convenzione spazio dei nomi / cartella.

Le classi devono essere archiviate in cartelle in base al loro spazio dei nomi.

In generale, creerai una directory src / nella cartella principale, posizionata allo stesso livello del fornitore /, e aggiungerai i tuoi progetti lì. Di seguito è riportato un esempio della struttura delle cartelle:

.
+-- 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

Differenza tra psr-0 e psr-4

PSR-0

È deprecato. Guardando il vendor/composer/autoload_namespaces.phpfile puoi vedere gli spazi dei nomi e le directory su cui sono mappati.

composer.json

"autoload": {
        "psr-0": {
            "Book\\": "src/",
            "Vehicle\\": "src/"
        }
} 
  • Cerchi Book \ History \ UnitedStates in src / Book /History/UnitedStates.php
  • Cerchi Vehicle \ Air \ Wings \ Airplane in src / Vehicle /Air/Wings/Airplane.php

PSR-4

Guardando il vendor/composer/autoload_psr4.phpfile puoi vedere gli spazi dei nomi e le directory su cui sono mappati.

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/",
        "Vehicle\\": "src/"
    }
}   
  • Cerchi Book \ History \ UnitedStates in src /History/UnitedStates.php
  • Cerchi Vehicle \ Air \ Wings \ Airplane in src /Air/Wings/Airplane.php

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/Book/",
        "Vehicle\\": "src/Vehicle/"
    }
}    
  • Cerchi Book \ History \ UnitedStates src / Book /History/UnitedStates.php
  • Cerchi Vehicle \ Air \ Wings \ Airplane in src / Vehicle /Air/Wings/Airplane.php

-4

Anche quando ho provato, ma Composer è un casino. Purtroppo, è l'unica alternativa del mercato.
Perché è un casino?
Il completamento automatico del compositore funziona bene se hai il controllo del codice. Tuttavia, se stai importando un progetto diverso, ti ritrovi con molti stili e modi per creare cartelle. Ad esempio, alcuni progetti sono /company/src/class.php mentre altri sono company / class.php e altri sono company / src / class / class.php

Ho creato una libreria che lo risolve:

https://github.com/EFTEC/AutoLoadOne (è gratuito, MIT).

Genera un autoincluso scansionando tutte le classi di una cartella, quindi funziona in ogni caso (psr-0 psr-4, classi senza spazio dei nomi, file con più classi ..

modifica: E ancora, ridimensionato senza motivo. ;-)


Leggi le informazioni sull'opzione classmap in composer.json. getcomposer.org/doc/04-schema.md#classmap - potrebbe essere il motivo per il downgrade della risposta.
Patrick,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.