Introduzione alla raccomandazione standard PHP (PSR)
Pubblicato: 2019-12-24C'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.

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.

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

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:


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.

- Crea un file compositore.json usando il compositore init. In caso contrario, puoi crearne uno manualmente ora nella radice del tuo progetto.

- Imposta il caricamento automatico della PSR4 modificando il file composer.json come mostrato di seguito:

- 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:

o


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.

- Creiamo prima un paio di classi all'interno della directory CodeCourse.
Crea AuthFilters.php all'interno di CodeCourse/Filters

Crea UserRepository.php all'interno di CodeCourse/Repositories

- 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-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è,

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

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

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.

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

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.

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:

Interpretazione di else se:

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:
