Introduzione alla raccomandazione standard PHP (PSR)

Pubblicato: 2019-12-24

C'era una volta, a una conferenza, i principali sviluppatori di una selezione di framework si sedevano nella stessa stanza e concordavano alcuni standard da utilizzare per tutti i loro progetti. L'obiettivo era quello di rendere i framework e le librerie PHP più facili da combinare per gli utenti. Fu allora che nacque php-fig: il PHP Framework Interop Group. Questo gruppo di persone fantastiche supervisiona le Raccomandazioni sugli standard PHP (PSR).


La PHP Standard Recommendation (PSR) è una specifica PHP pubblicata dal PHP Framework Interoperability Group (PHP-FIG). Serve alla standardizzazione dei concetti di programmazione in PHP. L'obiettivo è quello di consentire l'interoperabilità dei componenti. Il PHP-FIG è formato da diversi fondatori di framework PHP.

PSR-0 e PSR-4

Questi descrivono una specifica per il caricamento automatico delle classi dai percorsi dei file. PSR-0 e PSR-4 sono entrambi standard riguardanti spazi dei nomi, nomi di classi e percorsi di file. Questo PSR descrive anche dove posizionare i file che verranno caricati automaticamente in base alle specifiche.

Caricamento automatico

Il caricamento automatico è una funzionalità che aiuta gli sviluppatori a includere automaticamente le classi PHP senza scrivere ovunque istruzioni di inclusione/richiesta disordinate.
In PHP, la definizione della classe viene caricata con le istruzioni require o include nei file che vengono chiamati, ad esempio, prima di utilizzarla come mostrato di seguito.

immagine psr 1

L'approccio di cui sopra solleva alcuni problemi come se avessimo decine di classi esterne da utilizzare in un file e iniziassimo a scrivere righe di istruzioni require/include proprio all'inizio di un file sorgente.

Per superare questo problema PHP 5 ha introdotto la funzione magica __autoload() che viene chiamata automaticamente quando il codice fa riferimento a una classe o interfaccia che non è stata ancora caricata.

immagine psr 2

Ecco un esempio di un'implementazione __autoload() di base:

psr_image3

Il principale svantaggio della funzione __autoload() è che puoi fornire solo un autoloader con essa. PHP 5.1.2 ha introdotto un'altra funzione di caricamento automatico (spl_autoload_register) per far fronte alla limitazione di __autoload.

L'introduzione di spl_autoload_register() ha dato ai programmatori la possibilità di creare una catena di caricamento automatico, una serie di funzioni che possono essere chiamate per provare a caricare una classe o un'interfaccia.

Per esempio:

psr_image4psr_image5

Il caricamento automatico è stata un'idea così fantastica che ogni progetto ha iniziato a utilizzarlo. Inevitabilmente ognuno ha creato la propria versione di autoloader poiché mancavano standard uniformi. Chiaramente, PHP aveva un disperato bisogno di uno standard per il caricatore automatico, ed è così che è nato PSR-0. L'ultimo standard di caricatore automatico accettato è PSR-4.

PSR-0 (standard di caricamento automatico)

Panoramica di PSR-0:

  • Uno spazio dei nomi e una classe completi devono avere la seguente struttura
    \<Nome fornitore>\(<Spazio dei nomi>\)*<Nome classe>
  • Ogni spazio dei nomi deve avere uno spazio dei nomi di primo livello ("Nome fornitore").
  • Ogni spazio dei nomi può avere tutti i sottospazi dei nomi desiderati.
  • Ogni separatore dello spazio dei nomi viene convertito in DIRECTORY_SEPARATOR durante il caricamento dal file system.
  • Ogni carattere _ in CLASS NAME viene convertito in DIRECTORY_SEPARATOR. Il carattere _ non ha un significato speciale nello spazio dei nomi.
  • Lo spazio dei nomi e la classe completamente qualificati hanno il suffisso .php durante il caricamento dal file system.
  • I caratteri alfabetici nei nomi dei fornitori, negli spazi dei nomi e nei nomi delle classi possono essere di qualsiasi combinazione di lettere minuscole e maiuscole.

Esempi:

\Doctrine\Common\IsolatedClassLoader =>
/percorso/al/progetto/lib/vendor/Doctrine/Common/IsolatedClassLoader.php

\Symfony\Core\Request =>
/percorso/al/progetto/lib/vendor/Symfony/Core/Request.php

PSR-4 (standard di caricamento automatico)

Panoramica della PSR-4:

  • Il termine "classe" si riferisce a classi, interfacce, tratti e altre strutture simili.
  • Un nome di classe completo ha la seguente forma:
    \<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
  • Il nome completo della classe DEVE avere un nome dello spazio dei nomi di livello superiore, noto anche come "spazio dei nomi del fornitore".
  • Il nome di classe completo PU avere uno o più nomi di sotto-spazio dei nomi.
  • Il nome di classe completo DEVE avere un nome di classe di terminazione.
  • I trattini bassi non hanno un significato speciale in nessuna parte del nome completo della classe.
  • I caratteri alfabetici nel nome completo della classe POSSONO essere una qualsiasi combinazione di lettere minuscole e maiuscole.
  • Tutti i nomi delle classi DEVONO essere referenziati con distinzione tra maiuscole e minuscole.

Esempio di caricamento automatico basato su PSR-4 utilizzando Composer:

  • Considera la seguente struttura di directory per ottenere il caricamento automatico basato su PSR-4 utilizzando il compositore.
psr_image6
  • Crea un file compositore.json usando il compositore init. In caso contrario, puoi crearne uno manualmente ora nella radice del tuo progetto.
psr_image7
  • Imposta il caricamento automatico della PSR4 modificando il file composer.json come mostrato di seguito:
psr_image8
  • Qui, CodeCourse è un nome del fornitore della tua applicazione, puoi usare questo nome mentre assegni i file all'interno della tua directory src, come ad esempio:
    psr_image9

    o

psr_image10

eccetera,

  • E src è la directory della tua applicazione che vuoi caricare automaticamente.
  • Quindi, apri il tuo terminale e digita il seguente comando per installare i file di caricamento automatico nel tuo progetto. Questo genererà la directory del fornitore e il file autoload.php al suo interno.
psr_image11
  • Creiamo prima un paio di classi all'interno della directory CodeCourse.

Crea AuthFilters.php all'interno di CodeCourse/Filters

psr_image11

Crea UserRepository.php all'interno di CodeCourse/Repositories

psr_image12
  • Infine, crea un file index.php per testarlo e devi richiedere una volta il file autoload.php una volta nel tuo file index.php.
psr_image14

PSR-1 e PSR-2

PSR-1 e PSR-2 sono utili per gli standard di codifica PHP. PSR-1 si concentra principalmente sullo standard di codifica di base per PHP, mentre PSR-2 è più simile a una versione ampliata di PSR-1. PSR-1 elenca una serie di semplici regole per le convenzioni di denominazione e PSR-2 fornisce una guida allo stile di codifica più completa.

PSR-1 (Standard di codifica di base)

Panoramica di PSR-1:

  • Per i tag PHP sono consentiti solo <?php o <?=.
  • I nomi delle classi devono essere definiti in UpperCamelCase.
  • Le variabili di classe devono essere definite in camelCase.
  • Le costanti di classe devono essere definite in UPPER_SNAKE_CASE.
  • I nomi dei metodi devono essere definiti in camelCase.
  • I file DOVREBBE dichiarare simboli (classi, funzioni, costanti, ecc.) o causare effetti collaterali (ad es. generare output, modificare le impostazioni .ini, ecc.) ma NON DOVREBBE fare entrambe le cose. Cioè,
psr_image15

L'esempio sopra provoca un effetto collaterale, cioè il caricamento di un file denominato “file.php”.

  • I file devono essere in UTF-8 senza BOM (Byte Order Mark).
  • Gli spazi dei nomi e i nomi delle classi devono seguire gli standard in PSR-0 e PSR-4.

Ecco un esempio che illustra le convenzioni di denominazione di base per proprietà, classi e metodi.

psr_image16

PSR-2 (Guida allo stile di codifica)

Panoramica della PSR-2:

  • È necessario seguire gli standard di codifica PSR-1.
  • Per i rientri devono essere utilizzati 4 spazi. L'uso delle schede non è consentito.
  • Non c'è limite alla lunghezza della riga, ma dovrebbe essere inferiore a 120 caratteri e meglio se inferiore a 80.
  • Ci deve essere una riga vuota dopo la dichiarazione dello spazio dei nomi e deve esserci una riga vuota dopo la dichiarazione del blocco d'uso.
  • L'apertura delle parentesi graffe per classi e metodi deve andare sulla riga successiva e le parentesi graffe di chiusura devono andare sulla riga dopo il corpo.
  • I metodi e le proprietà devono essere definiti con abstract/final prima, seguito con public/protected e infine static.
  • Non devi inserire una nuova riga prima delle parentesi graffe nelle istruzioni condizionali.
  • Non devi inserire spazi prima ( e ) nelle istruzioni condizionali.
  • Un esempio per definire le classi:
  • È necessario aprire le parentesi graffe sulla nuova riga e le parole chiave extends e implements devono essere utilizzate in una singola riga.
psr_image17

Se ci sono più interfacce da implementare, puoi scrivere i nomi delle interfacce nella nuova riga come mostrato di seguito:

psr_image18

Esempio per mostrare come vengono definiti i metodi in PHP:
Durante la definizione dei metodi, gli argomenti dovrebbero essere scritti nella stessa riga. Inoltre, non devi inserire spazi bianchi prima delle virgole negli argomenti e devi inserire uno spazio bianco dopo di essi.

psr_image19

Se ci sono molti argomenti, allora possono essere scritti in una nuova riga uno dopo l'altro:

psr_image20

Quando si definiscono i metodi, è necessario disporre di uno tra pubblico/protetto/privato e astratto/finale. Le modalità di visibilità vengono dopo la parola chiave abstract/final, se utilizzata. static è l'ultimo modificatore.

psr_image21

Dichiarazioni condizionali

  • Devi inserire uno spazio bianco prima di (
  • Non devi inserire spazi bianchi dopo (
  • Non devi mettere nessuno spazio bianco prima)
  • Devi mettere uno spazio bianco dopo )
  • usa elseif piuttosto che else if.

Esempio per mostrare la differenza tra elseif e else se:
Interpretazione di elseif:

psr_image22

Interpretazione di else se:

psr_image23

Per le dichiarazioni di commutazione,

  • Le parentesi graffe devono essere aperte nella stessa riga in cui è scritta l'istruzione switch.
  • Il corpo del caso deve essere rientrato una volta dal caso e il caso deve essere rientrato una volta dallo switch.
  • Non utilizzare alcuna pausa quando non è necessaria la pausa.
  • Puoi anche usare return invece di break.

Esempio:

psr_image24