Spații de nume PHP în WordPress – un ghid fără prostii
Publicat: 2018-10-16Spațiile de nume PHP au aproape zece ani. Da, a trecut un deceniu (și da, îmbătrânești). În ciuda unui deceniu care a trecut de când PHP v5.3 a fost lansat, mulți dezvoltatori încă nu au o înțelegere de bază a spațiilor de nume. Adevărul să fie spus , WordPress nu folosește spații de nume , așa că „ nu trebuie să știi cum să folosești spațiile de nume dacă lucrezi doar cu WordPress ”. Nu trebuie să fii un ninja al spațiului de nume, dar să înțelegi elementele de bază este simplu și îți face bine.
Spațiile de nume PHP există de un deceniu și încă nu le folosiți pentru că nici #wordpress nu le folosește? Citește și începe să le folosești în 2 minute! #dezvoltare
CLICK PENTRU A TWETECând nu există suport pentru spații de nume - utilizați un prefix
Pentru o lungă, mult timp PHP nu a avut suport nativ pentru spațiile de nume. De aceea, WordPress și multe alte baze de cod mari nu folosesc spații de nume native. Nu erau acolo când era nevoie, așa că sunt folosite prefixe.
Spațiul de nume este important, deoarece se asigură că funcția ta write_to_log()
nu a fost deja definită de o altă bucată de cod. Pentru a evita ciocnirea numelor, totul în domeniul global are nevoie de un prefix, astfel încât funcția devine awesome_project_write_to_log()
și toate celelalte funcții și variabile primesc și prefixul awesome_project_
. Simplu? Este! Frumos? Nu chiar.
Există câteva alternative la această abordare, cum ar fi încapsularea metodelor statice. Încheiați toate funcțiile într-o clasă și le declarați ca metode statice. Apoi, în loc să apelați my_function()
apelați My_Class::my_function()
. Mai bine? Un pic, dar tot nu este spațierea corectă a numelor.
Să vedem cum spațiarea numelor permite ca mai multe bucăți de cod (sau pachete, dacă doriți) să folosească aceleași nume de clasă și funcție fără conflict. Sau, așa cum spune manualul PHP - cum activează încapsularea codului. Analogia lor cu fișierele și folderele este, de asemenea, perfectă – în multe feluri, spațiile de nume se comportă la fel ca folderele, așa că voi copia/lipi din manual;
În orice sistem de operare, directoarele servesc la gruparea fișierelor asociate și acționează ca un spațiu de nume pentru fișierele din ele. De exemplu, fișierul foo.txt poate exista atât în directorul /home/greg, cât și în /home/other, dar două copii ale foo.txt nu pot coexista în același director. Pentru a accesa fișierul foo.txt în afara directorului /home/greg, trebuie să punem înaintea numelui complet al directorului folosind separatorul de director pentru a obține /home/greg/foo.txt.
Declararea spațiilor de nume – amintiți-vă prima linie
Spațiul de namespace
al cuvântului cheie trebuie să fie prima linie de cod din fișier (fără a lua în considerare comentariile și orice conținut non-PHP). Spațiile de nume afectează numai clase, interfețe, funcții și constante. Ele nu afectează variabilele. Puteți defini același spațiu de nume în mai multe fișiere, permițându-vă să împărțiți codul în mai multe fișiere. Sub-spațiile de nume permit definirea unei ierarhii în spațiile de nume, la fel ca în foldere, folosind o bară oblică inversă – namespace myproject\level1\level2
. Acestea sunt reguli de bază și aproape toate pentru declararea spațiilor de nume.
// file-A.php contains a function under the myCompany\PackageA namespace namespace myCompany\PackageA; function do_something() { // do things }
// file-B.php contains a function with the same name // but under a different namespace namespace myCompany\PackageB; function do_something() { // do things }
Deși este posibil, aș recomanda cu căldură să nu combinați mai multe spații de nume într-un singur fișier. Crede-mă, mai devreme sau mai târziu vei uita că ai făcut-o și apoi depanarea unui bug de 2 minute durează două ore. Totuși, dacă trebuie, iată sintaxa.
// do not put multiple namespace declarations into the same file // but if you must, here's the syntax namespace MyFirstProject { const CONST = true; class Connection { /* ... */ } function connect() { /* ... */ } } namespace MySecondProject { const CONST = true; class Connection { /* ... */ } function connect() { /* ... */ } } // any code after this has to go in the global namespace namespace { $some_var = 1; function_in_global_namespace(); }
Utilizarea spațiilor de nume – amintiți-vă folderele
După cum am spus deja, spațiile de nume sunt extrem de asemănătoare cu folderele. Presupunând că fișierul foo.txt
se află în folderul curent; îl puteți referi cu un simplu foo.txt
. Dacă vă aflați cu un nivel deasupra folderului cu fișierul foo.txt
, atunci trebuie să utilizați o cale relativă ../foo.txt
sau una absolută /folder1/folder2/foo.txt
. Nimic de lux. Spațiile de nume folosesc aceeași paradigmă.
// remember after declaring a namespace // all our code is in it; like when you're working in a folder namespace mycompany\project; function foo() {} class foo { static function staticmethod() {} } // resolves to mycompany\project\foo() because of line #3 foo(); // likewise, resolves to mycompany\project\foo::staticmethod() foo::staticmethod(); // constant are affected by namespaces too // so we're working with mycompany\project\FOO echo FOO; // this is a relative path // resolves to mycompany\project\subnamespace\foo() subnamespace\foo(); // static methods are no different // mycompany\project\subnamespace\foo::staticmethod() subnamespace\foo::staticmethod(); // a full namespace path starts with a backslash // it resolves exactly to what it says it does \otherNamespace\Bar\foo(); // again same thing for a constant, full path nothing magical echo \otherNamespace\Bar\FOO;
Aruncă o privire la cuvântul cheie use
din manualul PHP – exemplele sunt grozave. Oferă o modalitate de a importa cod din alte spații de nume PHP în spațiul de nume curent sau de a face referire la un nume extern (complet calificat) cu un alias.
Da, aveți nevoie de spații de nume și ar trebui să le folosiți
Deoarece este mai mult decât evident privind sursa WordPress - nu trebuie să utilizați spații de nume, dar trebuie să utilizați o metodă de spațiere a numelor. Prefixarea cu wp_
în cazul lui WP. Deci, dacă o facem deja, de ce să nu o facem corect?
Spațiile de nume în PHP se integrează cu ușurință în orice flux de lucru de dezvoltare. Ele ușurează încărcarea automată, denumirea fișierelor și, în general, fac codul mai curat. Refactorizarea codului vechi nu este niciodată o sarcină populară (indiferent de limbajul de codare), așa că nu vă voi spune să mergeți mai departe și să refactorizați un proiect de 2 MB de lucru doar pentru a putea spune că utilizați spații de nume. Cu toate acestea, voi insista să folosiți spațiile de nume atunci când lucrați la proiecte noi. Îți vei mulțumi destul de curând.
Documentația oficială PHP despre spațiile de nume este dincolo de excelentă! Exemplele de cod sunt curate și comentariile utile în lumea reală. Asigurați-vă că îl răsfoiți, chiar dacă nu credeți că este necesar.