A fost o plimbare ciudată, în ceea ce privește suportul namespace-ului în PHP. Din fericire, a fost adăugat la limba în PHP 5.3, iar structura aplicabilă a codului PHP sa îmbunătățit foarte mult de atunci. Dar cum să le folosim?
"Nu uitați să scăpați de backslash atunci când stocați un nume de nume de nume într-un șir!"
Imaginați-vă un spațiu de nume ca un sertar în care puteți pune tot felul de lucruri: un creion, un conducător, o bucată de hârtie și așa mai departe. Acestea sunt lucrurile tale. Direct sub sertarul dvs. este altcineva, și el pune aceleași lucruri în el. Pentru a evita utilizarea obiectelor celeilalte, decideți să etichetați sertarele, astfel încât să fie clar ce aparține cine.
Anterior, dezvoltatorii trebuiau să utilizeze subliniere în clasele, funcțiile și constantele lor pentru a separa bazele de coduri. Asta e echivalent cu etichetarea obiectelor și a le pune într-un singur sertar mare. Sigur, e cel puțin o organizație, dar este foarte ineficientă.
Pasa la salvare! Puteți declara aceeași funcție, clasă, interfață și definiții constante în spații de nume separate fără a primi erori fatale. În esență, un spațiu de nume nu este altceva decât un bloc de coduri etichetat ierarhic care deține cod PHP regulat.
Este important să rețineți că utilizați indirect spațiile de nume; începând cu PHP 5.3, toate definițiile care nu sunt încă declarate într-un spațiu de nume definite de utilizator intră sub spațiul de nume global.
Spațiul de nume global deține, de asemenea, toate definițiile interne ale PHP, cum ar fi ecou()
, mysqli_connect ()
, si Excepție
clasă. Deoarece spațiul de nume global nu are un nume unic de identificare, cel mai adesea denumit spațiul global.
Rețineți că nu este o obligație de a utiliza spațiul de nume.
Scriptul dvs. PHP va funcționa perfect fără ele și acest comportament nu se va schimba foarte curând.
O definiție a spațiului de nume este prima declarație pe care trebuie să o întâlnească interpretul PHP într-un fișier PHP. Singura afirmație permisă să apară deasupra unei declarații din spațiul de nume este a declara
și apoi din nou, numai dacă declară codarea scriptului.
Declararea unui spațiu de nume este la fel de simplă ca și utilizarea Spațiu de nume
cuvinte cheie. Numele unui nume de domeniu trebuie să respecte aceleași reguli ca și alte identificatoare din PHP. Prin urmare, un spațiu de nume trebuie începeți cu o literă sau un underscore, urmată de un număr de litere, numere sau subliniere.
Dacă doriți să atribuiți un bloc de cod spațiului global, utilizați
Spațiu de nume
fără adăugarea unui nume.Aveți permisiunea să aveți mai multe spații de nume în același fișier.
De asemenea, puteți împrăștia același spațiu de nume în fișiere diferite; procesul de includere a fișierelor le îmbină automat. Prin urmare, este o bună practică de codificare pentru a limita cantitatea de definiții din spațiul de nume la unul pentru fiecare fișier, la fel cum ați face cu clasele.
Păstrarea numelor este utilizată pentru a evita definițiile conflictuale și pentru a introduce mai multă flexibilitate și organizare în baza de cod.
Rețineți că brațele din jurul blocului de coduri de nume sunt complet opționale. De fapt, respectarea regulii cu un numespațiu pe fișier și omiterea parantezelor curbate face ca codul dvs. să fie mult mai curat - nu este necesar să indentați codul imbricat.
Sub-namespace
Domeniile de nume pot urma o anumită ierarhie, la fel ca directoarele din sistemul de fișiere de pe computer. Sub-spațiile de nume sunt extrem de utile pentru organizarea structurii unui proiect. De exemplu, dacă proiectul dvs. necesită acces la baze de date, este posibil să doriți să puneți tot codul bazat pe bază de date, cum ar fi o excepție de la baza de date și un handler de conexiune, într-un spațiu sub-numit
Bază de date
.Pentru a menține flexibilitatea, este înțelept să stocați spații de sub-nume în subdirectoare. Acest lucru încurajează structurarea proiectului dvs. și ușurează utilizarea autoloader-urilor care respectă standardul PSR-0.
PHP utilizează backslash ca separator spațiu de nume.
Fun fapte: în RFC pentru a decide care separator de spațiu de nume ar trebui să fie utilizate, au luat în considerare chiar folosind un zâmbet.// myproject / database / link.phpPuteți avea cât mai multe spații de nume de câte doriți.
Definirea spațiilor de sub-nume cu blocuri de cod imbricate nu este acceptată. Următorul exemplu va arunca o eroare fatală foarte descriptivă: "Declarațiile spațiului de nume nu pot fi imbricate".
Apelarea unui cod dintr-un spațiu de nume
Dacă doriți să instanțiați un obiect nou, apelați o funcție sau utilizați o constantă dintr-un spațiu de nume diferit, utilizați notația din spate. Acestea pot fi rezolvate din trei puncte de vedere diferite:
Acesta este numele unei clase, unei funcții sau unei constante fără a include o referință la orice spațiu de nume. Dacă sunteți nou în spațiul de nume, acesta este punctul de vedere pe care sunteți obișnuit să lucrați.
Numele calificat
Acesta este modul în care accesăm ierarhia spațiului de sub-nume; utilizează notația din spate.
Exemplul de mai jos aruncă o eroare fatală: "Eroare fatală: Clasa" MyProject \ Database \ MyProject \ FileAccess \ Input "nu a fost găsită" deoarece
MyProject \ FileAccess \ intrare
este abordată relativ la spațiul de nume în care vă aflați în prezent.Numele complet calificat
Numele necalificate și calificate sunt ambele în raport cu spațiul de nume în care vă aflați în prezent. Ele pot fi utilizate numai pentru a accesa definițiile de la acel nivel sau pentru a se arunca mai adânc în ierarhia spațiului de nume.
Dacă doriți să accesați o funcție, o clasă sau o constantă care locuiesc la un nivel mai înalt în ierarhie, atunci trebuie să utilizați numele complet calificat - o cale absolută și nu o relativă. Acest lucru se reduce la prefixul apelului dvs. cu o backslash. Aceasta permite PHP să știe că acest apel ar trebui rezolvat din spațiul global, în loc să se apropie relativ de el.
Nu este necesar să utilizați numele complet calificat al funcțiilor interne PHP. Apelarea unui numele necalificat pentru o constantă sau o funcție care nu există în spațiul de nume pe care îl lucrați în prezent în rezultatele în PHP căutând spațiul de nume global pentru ele. Acesta este un backup nou construit, care nu se aplică numelor de clasă necalificate.
Având în vedere acest lucru, acum putem supraîncărca funcțiile interne ale PHP, în timp ce putem totuși să apelăm la funcția inițială (sau constanta pentru asta).
„;Apeluri dinamice
PHP este un limbaj de programare dinamic; astfel încât să puteți aplica această funcție și pentru apelarea codului de nume. Aceasta este, în esență, aceeași ca instanțierea claselor variabile sau includerea fișierelor variabile. Separatorul de spațiu de nume PHP este, de asemenea, un meta caracter în șiruri de caractere. Nu uitați să scapați de backslash atunci când stocați un nume de spațiu de nume într-un șir!
Spațiu de nume
cuvinte cheieNu numai că este
Spațiu de nume
cuvântul cheie utilizat pentru a defini un spațiu de nume, el poate fi, de asemenea, folosit pentru a rezolva în mod explicit spațiul de nume curent, funcțional similar cude sine
cuvânt cheie pentru clase.
__NAMESPACE__
constantLa fel ca
de sine
cuvântul cheie nu poate fi folosit pentru a determina care este numele clasei curente,Spațiu de nume
cuvântul cheie nu poate fi folosit pentru a determina care este spațiul de nume curent. Acesta este motivul pentru care avem__NAMESPACE__
constant.Această constantă este foarte utilă pentru învățare dacă începeți doar cu spații de nume; este, de asemenea, util pentru depanare. Deoarece este un șir, poate fi folosit și în combinație cu apelurile dinamice de cod pe care le-am discutat anterior.
Aliasing sau Import
"nu este o obligație de a folosi namespacing"
Pachetul de numere din PHP are suport pentru importatoare. Importul este denumit, de asemenea, ca Alianta. Numai clasele, interfețele și spațiile de nume pot fi aliate sau importate.
Importul este un aspect foarte util și fundamental al formării numelor. Vă oferă posibilitatea de a utiliza pachete de coduri externe, cum ar fi bibliotecile, fără a vă mai fi nevoie să vă faceți griji cu privire la numele contradictorii. Importul este realizat prin utilizarea funcției
utilizare
cuvinte cheie. Opțional, puteți specifica un alias personalizat cula fel de
cuvinte cheie.utilizați [nume de clasă, interfață sau spațiu de nume] ca [optional_custom_alias]Cum se face
Un nume complet calificat poate fi aliasat la un nume mai scurt, fără nume, astfel încât să nu trebuie să scrieți numele său complet calificat de fiecare dată când doriți să îl utilizați. Alibrarea sau importul ar trebui să aibă loc în cel mai înalt scop al unui spațiu de nume sau în domeniul global. Încercarea de a face acest lucru în scopul unei metode sau al unei funcții este sintaxa invalidă.
Alternativ, aveți posibilitatea să îl aliasați cu un nume diferit:
De asemenea, aveți posibilitatea să importați clase globale, cum ar fi
Excepție
clasă. Când este importat, nu mai trebuie să-i scrieți numele complet calificat.Rețineți că numele de import nu sunt rezolvate ca fiind relativ la spațiul de nume curent, ci dintr-un punct de vedere absolut, începând de la spațiul global. Aceasta înseamnă că nu este necesară o întoarcere în partea din față și nu este recomandată.
Deși este posibil să se apeleze dinamic codul cu nume, importul dinamic nu este acceptat.
Concluzie
Păstrarea numelor este utilizată pentru a evita definițiile conflictuale și pentru a introduce mai multă flexibilitate și organizare în baza de cod. Amintiți-vă că nu sunteți obligat să utilizați formatul de nume; este o caracteristică utilizată în combinație cu un flux de lucru orientat pe obiecte. Sperăm, totuși, să vă gândiți să luați proiectul dvs. (viitor) pentru PHP la nivelul următor, folosindu-vă numelepacing. Te-ai decis încă?