Namnrymd i PHP

Det har varit en ojämn åktur när det gäller namespace support i PHP. Tack och lov blev det lagt till språket i PHP 5.3, och den tillämpliga strukturen i PHP-koden har förbättrats kraftigt sedan dess. Men hur exakt använder vi dem?


Vad är en namnrymd?

"Glöm inte att flytta backslash när du lagrar namnnamn i en sträng!"

Föreställ dig ett namnutrymme som en låda där du kan lägga alla slags saker: en penna, en linjal, ett papper och så vidare. Dessa är dina tillhörigheter. Direkt under din låda är någon annans, och han lägger samma sak i den. För att undvika att använda varandras föremål bestämmer du att etikettera lådorna så det är klart vad som tillhör vem.

Tidigare måste utvecklare använda understreck i sina klasser, funktioner och konstanter för att skilja kodbaserna. Det motsvarar att märka varandras tillhörigheter och sätta dem i en stor låda. Visst, det är åtminstone någon form av organisation, men det är mycket ineffektivt.

Namespacing till räddningen! Du kan deklarera samma funktion, klass, gränssnitt och konstanta definitioner i separata namnområden utan att ta emot dödliga fel. Essentialy, ett namnrymd är inget mer än ett hierarkiskt märkt kodblock som innehar vanlig PHP-kod.

Du använder dem!

Det är viktigt att komma ihåg att du indirekt använder namnområden. från och med PHP 5.3 faller alla definitioner som ännu inte deklareras i en användardefinierad namnrymd under den globala namnrymden.

Den globala namnrymden innehåller också alla interna PHP-definitioner, som eko(), mysqli_connect (), och den Undantag klass. Eftersom den globala namnutrymmet inte har något unikt identifieringsnamn, kallas den oftast som globalt utrymme.

Observera att det inte är en skyldighet att använda namespacing.

Ditt PHP-skript fungerar helt bra utan dem, och detta beteende är inte på väg att förändras mycket snart.


Definiera en namnrymd

En namespace-definition är det första uttalandet som PHP-tolken ska stöta på i en PHP-fil. Det enda uttalandet som får ske över en navneutrymmesdeklaration är a förklara uttalandet, och sedan igen, endast om det förklarar kodningen av manuset.

Deklarera ett namnrymd är lika enkelt som att använda namespace nyckelord. Ett namnrymdnamn ska följa samma regler som andra identifierare i PHP. Därför måste en namnrymd Börja med ett brev eller understrykning, följt av ett antal bokstäver, siffror eller understreck.

 

Om du vill tilldela ett kodblock till det globala utrymmet använder du namespace sökord utan att lägga till ett namn.

 

Du får ha flera namnområden i samma fil.

 

Du kan också sprida samma namnrymd i olika filer. processen för filintegration sammanfogar automatiskt dem. Därför är det en bra kodningspraxis för att begränsa storleken av namespacedefinitioner till en per fil, precis som du skulle göra med klasser.

Namespacing används för att undvika motstridiga definitioner och introducera mer flexibilitet och organisation i din kodbas.

Observera att fästena som omger namespace-kodblocket är helt frivilliga. Faktum är att du håller fast vid en-namnpace-per-fil-regeln och utelämnar de krökta parenteserna, vilket gör att din kod är mycket renare - det finns inget behov av att ange den nestrade koden.

Undernamnrymder

Namnrymder kan följa en viss hierarki, ungefär som katalogerna i filsystemet på din dator. Undernamnrymder är extremt användbara för att organisera projektets struktur. Om ditt projekt exempelvis kräver databasåtkomst kanske du vill sätta all databasrelaterad kod, t.ex. ett undantag från databasen och anslutningshanteraren, i en undernamnrymd som heter Databas.

För att behålla flexibilitet är det klokt att lagra undernamnrymder i underkataloger. Detta uppmuntrar strukturering av ditt projekt och gör det mycket lättare att använda autoloaders som följer PSR-0-standarden.

PHP använder omvänt snedstreck som dess namnrymdsavskiljare.


Roligt faktum: i RFC att bestämma vilken namnrymdsavskiljare som ska användas, ansåg de även att använda en smiley.
// myproject / database / connection.php  

Du kan ha så många undernamnrymder som du vill.

 

Definiera undernamnrymder med kapslade kodblock stöds inte. Följande exempel kommer att kasta ett mycket beskrivande dödligt fel: "Namnutrymmedeklarationer kan inte nästas".

 

Ringa kod från en namnrymd

Om du vill instansera ett nytt objekt, ring en funktion eller använd en konstant från ett annat namnrymd, använd bakgrundsnoteringen. De kan lösas från tre olika synpunkter:

  • Okvalificerat namn
  • Kvalificerat namn
  • Fullständigt kvalificerat namn

Okvalificerat namn

Detta är namnet på en klass, funktion eller konstant utan att innehålla en hänvisning till någon namnrymd alls. Om du är ny på namespacing, är det den synpunkt du är van vid att arbeta från.

 

Kvalificerat namn

Så här får vi tillgång till undernavneområdeshierarkin; det använder sig av backslash notationen.

 

Exemplet nedan slår ett dödligt fel: "Felaktigt fel: Klass" MyProject \ Database \ MyProject \ FileAccess \ Input "hittades inte" eftersom " MyProject \ FileAccess \ Input närmar sig den namnrymd du befinner dig i.

 

Fullständigt kvalificerat namn

De okvalificerade och kvalificerade namnen är både i förhållande till namnrymden du befinner dig i. De kan bara användas för att få tillgång till definitioner på den nivån eller för att dyka djupare in i namespace-hierarkin.

Om du vill komma åt en funktion, klass eller konstant som bor på en högre nivå i hierarkin, måste du använda det fullständigt kvalificerade namnet - en absolut väg istället för släkting. Det här kollar ner för att förutföra ditt samtal med en backslash. Detta gör att PHP vet att det här samtalet ska lösas från det globala rummet istället för att närma sig det relativt.

 

Det är inte nödvändigt att använda det fullt kvalificerade namnet på interna PHP-funktioner. Ringer en okvalificerat namn för en konstant eller funktion som inte existerar i namnsutrymmet du arbetar för närvarande i resultat i PHP som söker den globala namnrymden för dem. Detta är en inbyggd fallback som inte gäller för okvalificerade klassnamn.

Med detta i åtanke kan vi nu överbelasta interna PHP-funktioner samtidigt som vi fortfarande kan ringa den ursprungliga funktionen (eller konstant för den delen).

'; 

Dynamiska samtal

PHP är ett dynamiskt programmeringsspråk; så du kan också använda denna funktion för att ringa namnpaced-kod. Detta är i grunden detsamma som att instansera variabla klasser eller inkludera variabla filer. Namnrymdsavskiljaren PHP använder är också ett metakaraktär i strängar. Glöm inte att flytta backslash när du lagrar namnnamn i en sträng!

 

De namespace Nyckelord

Inte bara är namespace nyckelordet användes för att definiera ett namnrymd, det kan också användas för att uttryckligen lösa till det aktuella namnrymden, som funktionellt liknar själv sökord för klasser.

 

De __NAMESPACE__ konstant

Mycket som själv sökord kan inte användas för att bestämma vad det aktuella klassnamnet är, namespace sökord kan inte användas för att bestämma vad den aktuella namnrymden är. Det är därför vi har __NAMESPACE__ konstant.

 

Denna konstant är mycket användbar för lärande om du bara börjar med namnområden. Det är också användbart för debugging. Eftersom det är en sträng, kan den också användas i kombination med dynamiska kodsamtal som vi tidigare diskuterade.


Aliasing eller Importering

"det är inte en skyldighet att använda namespacing"

Namespacing i PHP har stöd för importera. Importera kallas också aliasing. Endast klasser, gränssnitt och namnområden kan aliaseras eller importeras.

Importera är en mycket användbar och grundläggande aspekt av namespacing. Det ger dig möjligheten att använda externa kodpaket, som bibliotek, utan att behöva oroa sig för motstridiga namn. Importera uppnås genom att använda använda sig av nyckelord. Eventuellt kan du ange ett anpassat alias med som nyckelord.

använd [namn på klass, gränssnitt eller namnrymd] som [optional_custom_alias]

Hur det är gjort

Ett fullt kvalificerat namn kan aliaseras till ett kortare okvalificerat namn så att du inte behöver skriva sitt fullständiga namn varje gång du vill använda det. Aliasing eller import bör ske i högsta räckvidd av ett namnrymd eller i det globala räckviddet. Att försöka göra detta inom ramen för en metod eller funktion är ogiltig syntax.

 

Alternativt kan du alias till det ett annat namn:

 

Du får också importera globala klasser, som Undantag klass. När du importeras behöver du inte skriva sitt fullständiga namn längre.

Observera att importnamn inte är löst som i förhållande till nuvarande namnutrymme, men från en absolut synvinkel, från det globala utrymmet. Det innebär att en ledande backslash är onödig och inte rekommenderas.

 

Även om det är möjligt att dynamiskt ringa namnkodad kod, stöds inte dynamisk import.

 

Slutsats

Namespacing används för att undvika motstridiga definitioner och introducera mer flexibilitet och organisation i din kodbas. Kom ihåg att du inte är skyldig att använda namespacing; Det är en funktion som används i kombination med ett objektorienterat arbetsflöde. Förhoppningsvis kommer du emellertid att överväga att ta ditt (framtida) PHP-projekt till nästa nivå genom att använda namespacing. Har du bestämt dig än?