Dincolo de prefixare: un ghid pentru dezvoltatori WordPress pentru spațiile de nume PHP

Publicat: 2019-11-12

Prefix totul.

Este un adagiu care este vechi ca software-ul WordPress însuși. Prefixarea a fost un standard pentru dezvoltatorii WordPress de atât de mult timp încât este greu de imaginat să faci ceva diferit. Dar, a venit timpul pentru ceva nou. Ei bine, este de mult întârziat, dar WordPress rămâne puțin în urmă în practicile standard în lumea PHP mai mare.

Prefixarea este practica de a crea o versiune prietenoasă cu codul a numelui proiectului și de a o lipi în fața funcțiilor, claselor și altor lucruri din spațiul de nume global. De exemplu, ați numi o funcție tavern_get_post() în loc de get_post() pentru a evita ciocnirile de nume ale funcției, care ar duce la o eroare fatală.

Prefixarea este o formă de „spațiere de nume”, care este doar un mod elegant de a spune că numele din acest spațiu aparțin unui anumit proiect. Cu toate acestea, prefixarea (și sufixarea, care este mai puțin comună) este un hack dintr-o perioadă în care nu exista o soluție pentru limbajul PHP.

PHP 5.3 a introdus o metodă oficială de spațiere a numelor, astfel încât standardul există de ani de zile. Deoarece WordPress 5.2 a ridicat cerința PHP minimă la 5.6, este timpul ca dezvoltatorii să-și renunțe la vechile obiceiuri și să ajungă din urmă cu restul lumii PHP.

Spațiu de nume (Aproape) Totul

Spația dintre nume PHP acoperă numai următoarele elemente.

  • Clase
  • Interfețe
  • Trăsături
  • Funcții
  • Constante declarate cu cuvântul cheie const , dar nu define()

Când vine vorba de mânerele de script, numele de dimensiunea imaginii, opțiunile bazei de date și alte elemente din spațiul de nume global, trebuie totuși să le prefixați. Acestea sunt ID-uri și în afara domeniului de aplicare al spațiilor de nume PHP.

Cum se creează spații de nume

Spațiile de nume sunt ușor de declarat. În partea de sus a oricărui fișier PHP pe care doriți să îl utilizați un anumit spațiu de nume, declarați-l așa cum se arată în următorul fragment de cod.

 <?php

namespace Tavern;

Ceea ce face această linie de cod este să declare că totul din acest fișier are spațiul de nume Tavern .

Aruncă o privire la o funcție simplă sub acel spațiu de nume pentru a afișa un Hello, World! mesaj.

 <?php

namespace Taverna;

funcția salut() {
    _e('Buna ziua, lume!', 'example-textdomain');
}

Dacă urmați vechile reguli de prefixare, hello() ar fi fost numit tavern_hello() . Cu toate acestea, nu este cazul spațiilor de nume. Funcția hello() este încapsulată în spațiul de nume Tavern și nu va intra în conflict cu alte funcții numite hello() .

Clasele și interfețele funcționează la fel ca și funcțiile. Cu un nume de clasă Article , fișierul de clasă poate arăta ca următorul.

 <?php

namespace Tavern;

articol de clasa {
    // ...
}

Notă: Ar trebui să existe o singură clasă sau interfață pe fișier. Acest lucru este deosebit de important dacă intenționați vreodată să utilizați un încărcător automat.

Cum să denumești spațiile de nume

Dezvoltatorilor le place să se ceartă despre cum să denumească lucrurile și nu există o soluție unică. Cea mai importantă regulă este să fii unic pentru a evita ciocnirile cu codul din alte proiecte. Una dintre cele mai bune modalități de a face acest lucru este să utilizați un spațiu de nume Vendor de nivel superior cu un sub-spațiu de nume Package .

Să presupunem că spațiul de nume al furnizorului este Tavern și că proiectul în cauză era o temă WordPress numită News . Spațiul de nume pentru proiect ar putea arăta ca următorul.

 <?php

namespace Taverna\Știri;

Acest lucru poate fi puțin pronunțat pentru unii dezvoltatori. Dacă numele proiectului dvs. este deja destul de unic, cum ar fi „Awesomesauce”, este posibil să doriți pur și simplu să utilizați următoarele.

 <?php

namespace Awesomesauce;

Veți dori să veniți cu un fel de convenție standard, cel puțin, pentru dvs. În cele din urmă, veți dori să intrați în lucruri precum încărcarea automată, așa că vă va ajuta să aveți un sistem pe care îl urmați în toate proiectele. Simțiți-vă liber să citiți standardul PHP-FIG Autoloader.

Importarea claselor și funcțiilor într-un spațiu de nume diferit

Când trebuie să utilizați o clasă sau o funcție dintr-un spațiu de nume diferit de spațiul de nume curent, trebuie să o importați. Acest lucru se face prin cuvântul cheie use în PHP.

Declarația de use trebuie să vină după declarația spațiului de namespace . De asemenea, ar trebui să facă referire la numele complet calificat al clasei. Următorul cod importă clasa Tavern\Helpers\Post într-un fișier cu un spațiu de nume diferit.

 <?php

namespace Tavern\Șablon;

utilizați Tavern\Helpers\Post;

Odată importat, puteți utiliza în siguranță clasa Post direct, așa cum se arată în următorul fragment.

 $post = postare noua();

Începând cu PHP 5.6, puteți importa și funcții și constante din alte spații de nume folosind use function și, respectiv, use const . Următorul bloc de cod demonstrează cum să importați atât o funcție, cât și o constantă.

 <?php

namespace Tavern\Șablon;

utilizați funcția Tavern\Helpers\func_name;
folosește const Tavern\Helpers\CONSTANT_NAME;

Aliasarea claselor și funcțiilor

În cele din urmă, veți întâlni o situație în care trebuie să importați o clasă sau o funcție care are același nume ca o clasă sau o funcție în spațiul de nume curent. S-ar putea să vă gândiți că aceasta este problema pe care spațiile de nume au fost menite să o rezolve. Din fericire, PHP oferă o metodă de a crea un alias la import.

Să presupunem că aveți o clasă numită Tavern\User și trebuie să implementați interfața Tavern\Contracts\User . Când importați interfața, va trebui să creați un alias așa cum se arată mai jos.

 <?php

namespace Tavern;

utilizați Tavern\Contracts\User ca UserContract;

clasa Utilizatorul implementează UserContract {
    // ...
}

as UserContract atașat la sfârșitul instrucțiunii de use creează un alias pentru interfața cu User . Puteți utiliza în siguranță noul nume UserContract fără erori.

Clasele, interfețele, funcțiile și constantele urmează aceeași metodă pentru a crea un alias.

Organizarea structurii folderelor pe baza spațiilor de nume

Este o practică standard în lumea PHP mai largă ca spațiile de nume și structura de fișiere și foldere a proiectului să se potrivească. Făcând acest lucru, este ușor pentru alți dezvoltatori să localizeze cu ușurință codul în proiectul dvs. De asemenea, simplifică construirea de încărcătoare automate pentru încărcarea claselor la cerere.

În general, tot codul PHP ar trebui să intre într-un folder /src , /inc sau cu nume similar din proiectul dvs. Un exemplu de structură de fișier și folder de plugin ar putea arăta ca următorul.

 /nume-plugin
    /src
        /Core
            /Activate.php
            /Setup.php
        /Vedere
            /Post.php
            /Pagina.php

Dacă urmați aceeași structură cu spațiile de nume, fișierele .php de mai sus ar conține următoarele clase.

  • Tavern\Core\Activate
  • Tavern\Core\Setup
  • Tavern\View\Post
  • Tavern\View\Page

Rețineți că numele fișierelor și folderelor sunt sensibile la majuscule și ar trebui să se potrivească exact cu spațiul de nume și cu numele clasei.

Desigur, sunteți liber să urmați orice convenție doriți. Cu toate acestea, recomandarea anterioară este o bună practică și va simplifica modul în care vă organizați proiectele pe termen lung.

Beneficiile utilizării spațiilor de nume

Cel mai evident beneficiu este evitarea ciocnirilor între clase și funcții cu același nume. Ar trebui să utilizați spații de nume reale din același motiv pentru care ați folosit prefixele.

Spațiile de nume ajută la evitarea numelor lungi de clasă. Tastarea numelor lungi într-un proiect mare este în cel mai bun caz o practică obositoare.

Schimbați mai ușor implementările prin import. Odată ce ați apucat să importați clase și interfețe din alte spații de nume, puteți comuta o implementare a unei interfețe cu o singură linie de cod.

Încărcarea automată a claselor este mult mai ușoară dacă urmați standardul PSR-4: Autoloader, care necesită cel puțin un spațiu de nume de nivel superior.

Pentru dezvoltatorii din spațiul profesional, veți dobândi o abilitate comercializabilă dincolo de ecosistemul WordPress. Veți fi greu să găsiți activități de dezvoltare PHP dacă nu știți cum să utilizați spațiile de nume. Nu este un concept greu de înțeles, dar poate exista o curbă de învățare pentru unii în practică.