O introducere în recomandarea standard PHP (PSR)

Publicat: 2019-12-24

Pe vremuri, la o conferință, dezvoltatorii principali dintr-o selecție de cadre s-au așezat în aceeași cameră și au convenit asupra unor standarde pe care să le folosească toate proiectele lor. Scopul a fost de a face cadrele și bibliotecile PHP mai ușor de combinat pentru utilizatori. Atunci s-a născut php-fig: PHP Framework Interop Group. Acest grup de indivizi extraordinari supraveghează Recomandările Standardelor PHP (PSR).


Recomandarea standard PHP (PSR) este o specificație PHP publicată de PHP Framework Interoperability Group (PHP-FIG). Servește standardizarea conceptelor de programare în PHP. Scopul este de a permite interoperabilitatea componentelor. PHP-FIG este format din mai mulți fondatori de cadre PHP.

PSR-0 și PSR-4

Acestea descriu o specificație pentru clasele de încărcare automată din căile fișierelor. PSR-0 și PSR-4 sunt ambele standarde privind spațiile de nume, numele claselor și căile fișierelor. Acest PSR descrie, de asemenea, unde să plasați fișierele care vor fi încărcate automat conform specificațiilor.

Încărcare automată

Încărcarea automată este o funcționalitate care ajută dezvoltatorii, inclusiv clasele PHP în mod automat, fără a scrie declarații aglomerate include/require peste tot.
În PHP, definiția clasei este încărcată cu instrucțiuni require sau include în fișierele pe care le numesc, adică înainte de a o utiliza, așa cum se arată mai jos.

imaginea psr 1

Abordarea de mai sus ridică unele probleme ca și cum am avea zeci de clase externe de utilizat într-un fișier și am începe să scriem linii de instrucțiuni require/include chiar la începutul unui fișier sursă.

Pentru a depăși această problemă, PHP 5 a introdus funcția magică __autoload() care este apelată automat atunci când codul dvs. face referire la o clasă sau o interfață care nu a fost încă încărcată.

imaginea psr 2

Iată un exemplu de implementare de bază a __autoload():

psr_image3

Dezavantajul major al funcției __autoload() este că puteți furniza doar un singur autoloader. PHP 5.1.2 a introdus o altă funcție de încărcare automată (spl_autoload_register) pentru a face față limitării __autoload.

Introducerea spl_autoload_register() a oferit programatorilor posibilitatea de a crea un lanț de încărcare automată, o serie de funcții care pot fi apelate pentru a încerca să încarce o clasă sau o interfață.

De exemplu:

psr_image4psr_image5

Încărcarea automată a fost o idee atât de grozavă încât fiecare proiect a început să o folosească. Inevitabil, toată lumea și-a creat propria versiune de autoloader, deoarece lipseau standardele uniforme. În mod clar, PHP avea nevoie cu disperare de un standard pentru încărcarea automată, așa cum a luat naștere PSR-0. Cel mai recent standard acceptat de încărcare automată este PSR-4.

PSR-0 (Standard de încărcare automată)

Prezentare generală a PSR-0:

  • Un spațiu de nume și o clasă complet calificate trebuie să aibă următoarea structură
    \<Nume furnizor>\(<Spațiu de nume>\)*<Nume clasă>
  • Fiecare spațiu de nume trebuie să aibă un spațiu de nume de nivel superior („Numele furnizorului”).
  • Fiecare spațiu de nume poate avea câte sub-spații de nume dorește.
  • Fiecare separator de spațiu de nume este convertit într-un DIRECTORY_SEPARATOR la ​​încărcarea din sistemul de fișiere.
  • Fiecare caracter _ din NUMELE CLASEI este convertit într-un DIRECTORY_SEPARATOR. Caracterul _ nu are o semnificație specială în spațiul de nume.
  • Spațiul de nume complet calificat și clasa sunt sufixate cu .php atunci când se încarcă din sistemul de fișiere.
  • Caracterele alfabetice din numele furnizorilor, spațiile de nume și numele claselor pot fi din orice combinație de litere mici și majuscule.

Exemple:

\Doctrine\Common\IsolatedClassLoader =>
/path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php

\Symfony\Core\Request =>
/path/to/project/lib/vendor/Symfony/Core/Request.php

PSR-4 (standard de încărcare automată)

Prezentare generală a PSR-4:

  • Termenul „clasă” se referă la clase, interfețe, trăsături și alte structuri similare.
  • Un nume de clasă complet calificat are următoarea formă:
    \<NamspaceName>(\<SubNamspaceNames>)*\<ClassName>
  • Numele de clasă complet calificat TREBUIE să aibă un nume de spațiu de nume de nivel superior, cunoscut și ca „spațiu de nume furnizor”.
  • Numele de clasă complet calificat POATE să aibă unul sau mai multe nume de sub-spații de nume.
  • Numele de clasă complet calificat TREBUIE să aibă un nume de clasă finală.
  • Litere de subliniere nu au o semnificație specială în nicio porțiune a numelui complet calificat al clasei.
  • Caracterele alfabetice din numele clasei complet POT fi orice combinație de litere mici și majuscule.
  • Toate numele claselor TREBUIE să fie menționate într-un mod sensibil la majuscule.

Exemplu de încărcare automată bazată pe PSR-4 folosind Composer:

  • Luați în considerare următoarea structură de directoare pentru a realiza încărcarea automată bazată pe PSR-4 folosind compozitor.
psr_image6
  • Creați un fișier composer.json folosind composer init. Dacă nu, puteți crea unul manual acum în rădăcina proiectului.
psr_image7
  • Configurați încărcarea automată PSR4 prin editarea fișierului composer.json, după cum se arată mai jos:
psr_image8
  • Aici, CodeCourse este un nume de furnizor al aplicației dvs., puteți utiliza acest nume în timp ce spațiați fișierele din interiorul directorului dvs. src, cum ar fi:
    psr_image9

    Sau

psr_image10

etc,

  • Și src este directorul aplicației pe care doriți să îl încărcați automat.
  • Apoi, deschideți terminalul și tastați următoarea comandă pentru a instala fișierele de încărcare automată în proiectul dvs. Acest lucru va genera directorul furnizorului și fișierul autoload.php în interiorul acestuia.
psr_image11
  • Să creăm mai întâi câteva clase în directorul CodeCourse.

Creați AuthFilters.php în CodeCourse/Filters

psr_image11

Creați UserRepository.php în CodeCourse/Repositories

psr_image12
  • În cele din urmă, creați un fișier index.php pentru a-l testa și trebuie să solicitați o dată fișierul autoload.php în fișierul dvs. index.php.
psr_image14

PSR-1 și PSR-2

PSR-1 și PSR-2 sunt utile pentru standardele de codare PHP. PSR-1 se concentrează în principal pe standardul de codare de bază pentru PHP, în timp ce PSR-2 este mai mult ca o versiune extinsă a PSR-1. PSR-1 enumeră un set de reguli simple pentru convențiile de numire, iar PSR-2 oferă un ghid mai cuprinzător de stil de codare.

PSR-1 (standard de codificare de bază)

Prezentare generală a PSR-1:

  • Numai <?php sau <?= sunt permise pentru etichetele PHP.
  • Numele claselor trebuie definite în UpperCamelCase.
  • Variabilele de clasă trebuie definite în camelCase.
  • Constantele clasei trebuie definite în UPPER_SNAKE_CASE.
  • Numele metodelor trebuie definite în camelCase.
  • Fișierele TREBUIE fie să declare simboluri (clase, funcții, constante, etc.) fie să provoace efecte secundare (de exemplu, să genereze rezultate, să modifice setările .ini etc.), dar NU TREBUIE să facă ambele. adica
psr_image15

Exemplul de mai sus provoacă un efect secundar, adică încărcarea unui fișier numit „file.php”.

  • Fișierele trebuie să fie în UTF-8 fără BOM (Byte Order Mark).
  • Spațiile de nume și numele claselor trebuie să respecte standardele din PSR-0 și PSR-4.

Iată un exemplu care ilustrează convențiile de bază de numire pentru proprietăți, clase și metode.

psr_image16

PSR-2 (Ghid de stil de codare)

Prezentare generală a PSR-2:

  • Trebuie să urmați standardele de codare PSR-1.
  • Pentru indentări trebuie folosite 4 spații. Utilizarea filelor nu este permisă.
  • Nu există limită pentru lungimea rândului, dar ar trebui să fie sub 120 de caractere și cel mai bine dacă este sub 80.
  • Trebuie să existe o linie goală după declararea spațiului de nume și trebuie să existe o linie goală după declarația blocului de utilizare.
  • Deschiderea bretelelor pentru clase și metode trebuie să meargă pe linia următoare, iar bretele de închidere trebuie să meargă pe linia după corp.
  • Metodele și proprietățile trebuie definite mai întâi cu abstract/final, urmate de public/protected și, în final, cuvânt cheie static.
  • Nu trebuie să puneți o linie nouă înaintea acoladelor în instrucțiunile condiționate.
  • Nu trebuie să puneți spații înainte de ( și ) în instrucțiunile condiționate.
  • Un exemplu pentru definirea claselor:
  • Trebuie să deschideți acoladele pe noua linie, iar cuvântul cheie extinde și implements trebuie folosit într-o singură linie.
psr_image17

Dacă există mai multe interfețe de implementat, atunci puteți scrie numele interfeței în noua linie, așa cum se arată mai jos:

psr_image18

Exemplu pentru a arăta cum sunt definite metodele în PHP:
La definirea metodelor, argumentele ar trebui să fie scrise în aceeași linie. De asemenea, nu trebuie să puneți niciun spațiu alb înainte de virgulă în argumente și trebuie să puneți un spațiu alb după ele.

psr_image19

Dacă există mai multe argumente, atunci acestea pot fi scrise în linie nouă unul după altul:

psr_image20

Când definiți metode, trebuie să aveți fie una dintre public/protejat/privat și abstract/final. Modurile de vizibilitate vin după cuvântul cheie abstract/final, dacă este folosit. static este ultimul modificator.

psr_image21

Declarații condiționale

  • Trebuie să puneți un spațiu alb înainte (
  • Nu trebuie să puneți spații albe după (
  • Nu trebuie să puneți spații albe înainte)
  • Trebuie să puneți un spațiu alb după)
  • folosește elseif mai degrabă decât elseif.

Exemplu pentru a arăta diferența dintre elseif și else if:
Interpretarea lui elseif:

psr_image22

Interpretarea altora dacă:

psr_image23

Pentru declarațiile switch,

  • Acoladele trebuie deschise în aceeași linie în care este scrisă instrucțiunea switch.
  • Corpul carcasei trebuie să fie indentat o dată din carcasă, iar carcasa trebuie să fie adâncit o dată de la comutator.
  • Nu folosiți pauză atunci când nu este nevoie de pauză.
  • De asemenea, puteți folosi return în loc de pauză.

Exemplu:

psr_image24