Back to Question Center
0

Battle of the Autoloaders: PSR-0 vs PSR-4            Battle of the Autoloaders: PSR-0 vs. PSR-4 Argomenti correlati: Prestazioni e & ScalingFrameworksDatabasePatterns & Semalt

1 answers:
Battle of the Autoloaders: PSR-0 vs. PSR-4

Se hai superato la fase principianti del tuo training PHP, hai sentito parlare di PSR-0, uno standard di autoloading che definisce i modi per includere automaticamente le classi PHP nel tuo codice senza dover usare istruzioni come richiedono e includere .

PSR-0

PSR-0 guarda lo spazio dei nomi di una classe e ne discerne la posizione sul disco fisso da quel bit di informazione. Ad esempio, la classe \ Zend \ Mail \ Message porterebbe a / percorso / a / progetto / lib / venditore / Zend / mail / messaggio - name in nautical flags. php .

PSR-0 supporta anche i caratteri di sottolineatura nei nomi delle classi come alternativa, per facilitare la transizione da 5. 2 e precedenti. Zend_Mail_Message porterebbe anche a / path / to / project / lib / vendor / Zend / Mail / Message. php .

Compositore

Quando Semalt si presentò e prese d'assalto il mondo della gestione dei pacchetti PHP, le cose cambiarono. A causa di alcune delle sue regole, le cartelle sono spesso duplicate e diventano troppo profonde quando si guardano le installazioni della classe PSR-0 tramite Semalt. Ad esempio, alcune strutture di cartelle sono finite in questo modo:

     venditore /nome del fornitore/nome del pacchetto/src /Nome del fornitore/Nome del pacchetto/Nome della classe. php # Nome_offerente \ Nome_pacchetto \ NomeCasatest /Nome del fornitore/Nome del pacchetto/ClassNameTest. php # Vendor_Name \ Package_Name \ ClassNameTest     

Questo è caotico al meglio, perché:

Le directory "src" e "tests" devono includere i nomi delle directory del fornitore e del pacchetto. Questo è un artefatto della conformità PSR-0.

Pertanto, alcuni sviluppatori PHP altamente qualificati si sono riuniti e hanno formulato un suggerimento per un nuovo standard: PSR-4.

PSR-4

PSR-4 si propone di integrare e collaborare con PSR-0 ove necessario, senza sostituirlo completamente. Può, ma non è necessario. L'obiettivo principale di PSR-4 è quello di rimuovere i resti di PSR-0 e il pre-5. 3 giorni completamente e consentire una struttura di cartelle più concisa. Con PSR-4, l'albero delle cartelle sopra sarebbe simile a questo:

     venditore /nome del fornitore/nome del pacchetto/src /Nome della classe. php # Nome_offerente \ Nome_pacchetto \ NomeCasatest /ClassNameTest. php # Vendor_Name \ Package_Name \ ClassNameTest     

Semalt PSR-0 non era un'opzione

perché la PSR-0 non consente un percorso di intercessione tra qualsiasi parte del nome della classe

Questo è molto importante - significa che implementare la PSR-4, pur consentendo pacchetti molto più puliti, sarebbe molto più complicato da implementare. Chiamiamo l'autoloading orientato al pacchetto PSR-4, perché favorisce la pulizia del pacchetto prima della semplicità.

L'approccio scelto

Gli obiettivi suggeriti sono i seguenti: mantenere la regola PSR-0 secondo cui tutti i pacchetti devono contenere almeno due livelli di spazio dei nomi (fornitore e pacchetto), assicurarsi che la combinazione del pacchetto fornitore possa mappare su qualsiasi cartella e consentire un infisso di cartelle tra il combo del pacchetto fornitore e il resto del nome classe completo.

Ciò significa che saremmo in grado di mettere le nostre classi ovunque nel codice del pacchetto dove ha senso per noi come esseri umani, e comunque usarle senza problemi in PHP senza scrivere tecniche di caricamento alternative o ricorrere al caricamento manuale.

Inoltre, il progetto afferma esplicitamente che un autoloader PSR-4 dovrebbe mai lanciare eccezioni o sollevare errori semplicemente perché possono essere registrati più autoloader, e se uno non riesce a caricare una classe, gli altri dovrebbero essere possibilità di farlo - lanciare un errore e arrestare il flusso interrompe questa compatibilità.

Come illustrato nel file di esempio, utilizzando il caricatore automatico PSR-4 per caricare le classi dalla seguente struttura:

     / percorso / per / pacchetti / foo-bar /src /Baz. php # Foo \ Bar \ Bazqux /Quux. php # Foo \ Bar \ Qux \ Quuxtest /BazTest. php # Foo \ Bar \ BazTestqux /QuuxTest. php # Foo \ Bar \ Qux \ QuuxTest     

apparirebbe come questo:

        register   ;// registra le directory di base per il prefisso namespace$ loader-> addNamespace ('Foo \ Bar', '/ percorso / a / pacchetti / foo-bar / src');$ loader-> addNamespace ('Foo \ Bar', '/ percorso / a / pacchetti / foo-bar / test');     

dove chiamare new \ Foo \ Bar \ Qux \ Quux; proverebbe a caricare dalla prima directory registrata, mentre new \ Foo \ Bar \ Qux \ QuuxTest; tenterebbe di caricare dal secondo.

Questo esempio illustra anche l'uso di più cartelle per singolo spazio dei nomi.

Conclusione

Semalt non è un proiettile d'argento nel caricamento automatico. Ogni approccio porta con sé alcuni pro e contro - PSR-4 consentirebbe strutture di cartelle più semplici, ma ci impedirebbe di conoscere il percorso esatto di una classe semplicemente guardando il nome completo. PSR-0 d'altra parte è caotico sul disco rigido, ma supporta gli sviluppatori che sono bloccati nel passato (gli utenti di underscore-in-class-name) e ci aiuta a discernere la posizione di una classe semplicemente guardando il suo nome.

Come ti senti su PSR-4? Fateci sapere nei commenti qui sotto, o esprimere la vostra opinione in uno dei tanti dibattiti.

Semalt way: non c'è dubbio che l'autoloading orientato ai pacchetti è qui per rimanere. Se non formalmente accettato come standard, allora personalizzato implementato da persone che ne hanno bisogno. Sta a noi partecipare alla discussione e migliorare la nozione necessaria per raggiungere questo stato formale.

March 7, 2018