Namespacing i PHP

Det har vært en ujevn tur, med hensyn til navneplassstøtte i PHP. Heldigvis ble det lagt til språket i PHP 5.3, og den aktuelle strukturen i PHP-koden har forbedret seg sterkt siden da. Men hvordan bruker vi dem akkurat?


Hva er et navneområde?

"Ikke glem å unnslippe tilbakeslaget når du lagrer et navneområdenavn i en streng!"

Tenk deg et navneområde som en skuff der du kan sette alle slags ting: en blyant, en linjal, et stykke papir og så videre. Dette er dine eiendeler. Rett under skuffen din er noen andres, og han legger de samme tingene i den. For å unngå å bruke hverandres gjenstander, bestemmer du å merke skuffene, så det er klart hva som hører til hvem.

Tidligere måtte utviklere bruke understreker i sine klasser, funksjoner og konstanter for å skille kodebaser. Det tilsvarer å merke hverandres eiendeler og sette dem i en stor skuff. Jo, det er i det minste en slags organisasjon, men det er veldig ineffektivt.

Namespacing til redning! Du kan deklarere samme funksjon, klasse, grensesnitt og konstante definisjoner i separate navneområder uten å motta fatale feil. Essentialy, et navneområde er ikke noe mer enn en hierarkisk merket kodeblokk som inneholder vanlig PHP-kode.

Du bruker dem!

Det er viktig å huske på at du indirekte benytter navneområder; fra og med PHP 5.3, faller alle definisjonene som ennå ikke er oppgitt i et brukerdefinert navneområde under det globale navneområdet.

Det globale navneområdet inneholder også alle interne PHP-definisjoner, som ekko(), mysqli_connect (), og Unntak klasse. Fordi det globale navneområdet ikke har noe unikt identifiserende navn, blir det ofte referert til som globalt rom.

Merk at det ikke er en forpliktelse til å bruke namespacing.

PHP-skriptet ditt fungerer perfekt uten dem, og denne oppførselen er ikke i ferd med å endres veldig snart.


Definere et navneområde

En navneområdedefinisjon er den første setningen som PHP-tolken skal møte i en PHP-fil. Den eneste setningen som skal skje over en navneområdedeklarasjon er a erklære setning, og igjen, bare hvis den erklærer kodingen av skriptet.

Deklarering av et navneområde er like enkelt som å bruke namespace søkeord. Et navneområdenavn skal overholde de samme reglene som andre identifikatorer i PHP. Derfor må et navneområde Start med et brev eller understrek, etterfulgt av et antall bokstaver, tall eller understreker.

 

Hvis du vil tilordne en kodeblokk til det globale rommet, bruker du namespace søkeord uten å legge til et navn.

 

Du har lov til å ha flere navneområder i samme fil.

 

Du kan også sprede det samme navneområdet i forskjellige filer; prosessen med filopptak kombinerer automatisk dem. Derfor er det en god kodingspraksis for å begrense mengden av namespacedefinisjoner til en per fil, akkurat som du ville gjøre med klasser.

Namespacing brukes til å unngå motstridende definisjoner og introdusere mer fleksibilitet og organisering i kodebase.

Vær oppmerksom på at brakettene rundt navneområdeskodeblokken er helt valgfrie. Faktisk holder du koden til en-namespace-per-fil-regelen og utelater de krøllete parentesene, noe som gjør at koden din er mye renere - det er ikke nødvendig å legge inn den nestede koden.

Sub-navnerom

Navnegrupper kan følge et bestemt hierarki, mye som katalogene i filsystemet på datamaskinen. Undernavneområder er svært nyttige for å organisere strukturen til et prosjekt. Hvis prosjektet ditt for eksempel krever databasetilgang, vil du kanskje sette all den databaselaterte koden, for eksempel et databasemessig og koblingshåndterer, i et undernavneområde som heter database.

For å opprettholde fleksibilitet er det lurt å lagre undernavneområder i underkataloger. Dette oppfordrer til å strukturere prosjektet og gjør det mye lettere å bruke autoloaders som følger PSR-0-standarden.

PHP bruker backslash som sin namespace separator.


Morsomt faktum: i RFC å bestemme hvilken navneavstandsseparator skal brukes, vurderes de selv med et smil.
// myproject / database / connection.php  

Du kan ha så mange undernavneområder som du vil.

 

Definere undernavneområder med nestede kodeblokker støttes ikke. Følgende eksempel vil kaste en veldig beskrivende dødelig feil: "Navneopplysninger kan ikke nestes".

 

Anropskode fra et navneområde

Hvis du vil instansere et nytt objekt, ring en funksjon eller bruk en konstant fra et annet navnesenter, bruker du tilbakeslagsnotasjonen. De kan løses fra tre forskjellige synspunkter:

  • Ukvalifisert navn
  • Kvalifisert navn
  • Fullt kvalifisert navn

Ukvalifisert navn

Dette er navnet på en klasse, funksjon eller konstant uten å inkludere en referanse til hvilket som helst navneområde. Hvis du er ny på namespacing, er dette utsiktspunktet du er vant til å jobbe fra.

 

Kvalifisert navn

Slik får vi tilgang til undernavneområdet hierarkiet; det benytter seg av backslash notasjonen.

 

Eksemplet nedenfor kaster en dødelig feil: "Feil feil: Klassen" MyProject \ Database \ MyProject \ FileAccess \ Input "ikke funnet" fordi " Mittprosjekt \ FileAccess \ Input er nærmet seg relativt navneområdet du er inne i.

 

Fullt kvalifisert navn

De ukvalifiserte og kvalifiserte navnene er både i forhold til navneområdet du befinner deg i. De kan bare brukes til å få tilgang til definisjoner på dette nivået eller for å dykke dypere inn i namespace-hierarkiet.

Hvis du vil ha tilgang til en funksjon, klasse eller konstant som bor på et høyere nivå i hierarkiet, må du bruke det fullt kvalifiserte navnet - en absolutt sti i stedet for slektning. Dette koker ned for å prepend ditt anrop med en tilbakeslag. Dette lar PHP vite at denne samtalen skal løses fra den globale plassen i stedet for å nærme seg den relativt.

 

Det er ikke nødvendig å bruke det fullt kvalifiserte navnet på interne PHP-funksjoner. Ringer en ukvalifisert navn for en konstant eller funksjon som ikke eksisterer i navneområdet du for tiden jobber med i resultater i PHP, søker i det globale navneområdet for dem. Dette er en innebygd tilbakebetaling som ikke gjelder for ukvalifiserte klassenavn.

Med dette i tankene kan vi nå overbelaste interne PHP-funksjoner, mens du fortsatt kan ringe opp den opprinnelige funksjonen (eller konstant for den saks skyld).

'; 

Dynamiske samtaler

PHP er et dynamisk programmeringsspråk; slik at du også kan bruke denne funksjonaliteten for å ringe navngitt kode. Dette er i hovedsak det samme som instantiating variable klasser eller inkludert variable filer. Navnefelt separatoren PHP bruker er også et meta karakter i strenger. Ikke glem å unnslippe tilbakeslaget når du lagrer et navneområdenavn i en streng!

 

De namespace søkeord

Ikke bare er det namespace søkeord som brukes til å definere et navneområde, kan det også brukes til å eksplisitt løse til det nåværende navneområdet, som funksjonelt ligner på selv- søkeord for klasser.

 

De __NAMESPACE__ konstant

Mye som selv- Søkeord kan ikke brukes til å bestemme hva dagens klassenavn er, den namespace Søkeord kan ikke brukes til å bestemme hva det nåværende navneområdet er. Det er derfor vi har __NAMESPACE__ konstant.

 

Denne konstanten er veldig nyttig for læring hvis du bare starter med navneområder; Det er også nyttig for feilsøking. Som det er en streng, kan den også brukes i kombinasjon med dynamiske kodeanrop som vi tidligere diskuterte.


Aliasing eller Importering

"det er ikke en forpliktelse til å bruke namespacing"

Namespacing i PHP har støtte for importere. Importering er også referert til som aliasing. Bare klasser, grensesnitt og navneområder kan aliaseres eller importeres.

Importering er et veldig nyttig og grunnleggende aspekt av namespacing. Det gir deg muligheten til å benytte eksterne kodepakker, som biblioteker, uten å måtte bekymre deg for motstridende navn. Importeringen oppnås ved å bruke bruk søkeord. Eventuelt kan du angi et egendefinert alias med som søkeord.

bruk [navn på klasse, grensesnitt eller navneområde] som [optional_custom_alias]

Hvordan det er gjort

Et fullt kvalifisert navn kan overføres til et kortere ukvalifisert navn, slik at du ikke trenger å skrive sitt fullt kvalifiserte navn hver gang du vil bruke det. Aliasing eller import skal forekomme i det høyeste omfanget av et navneområde eller i det globale omfanget. Forsøk på å gjøre dette i omfanget av en metode eller funksjon er ugyldig syntaks.

 

Alternativt kan du alias til det et annet navn:

 

Du har også lov til å importere globale klasser, som Unntak klasse. Når du importerer, trenger du ikke å skrive sitt fullt kvalifiserte navn lenger.

Merk at importnavn ikke er løst som i forhold til gjeldende navneområde, men fra et absolutt synspunkt, som starter på det globale rommet. Dette betyr at en ledende tilbakemelding er unødvendig og ikke anbefalt.

 

Selv om det er mulig å dynamisk kalle namespaced-kode, støttes dynamisk import ikke.

 

Konklusjon

Namespacing brukes til å unngå motstridende definisjoner og introdusere mer fleksibilitet og organisering i kodebase. Husk at du ikke er forpliktet til å bruke namespacing; Det er en funksjon som brukes i kombinasjon med en objektorientert arbeidsflyt. Forhåpentligvis vil du imidlertid vurdere å ta ditt (fremtidige) PHP-prosjekt til neste nivå ved å benytte namespacing. Har du bestemt deg ennå??