Namespacing in PHP

Het is een hobbelige rit geweest, met betrekking tot de ondersteuning van naamruimten in PHP. Gelukkig is het in PHP 5.3 aan de taal toegevoegd en is de van toepassing zijnde structuur van PHP-code sindsdien enorm verbeterd. Maar hoe precies gebruiken we ze?


Wat is een naamruimte?

"Vergeet niet om de backslash te verlaten wanneer u een naamruimtenaam in een tekenreeks opslaat!"

Stel je een naamruimte voor als een la waarin je allerlei dingen kunt zetten: een potlood, een liniaal, een stuk papier, enzovoort. Dit zijn je bezittingen. Direct onder je la zit iemand anders en hij legt dezelfde dingen erin. Om te voorkomen dat u elkaars items gebruikt, beslist u om de laden te labelen, zodat het duidelijk is wat bij wie hoort.

Eerder moesten ontwikkelaars underscores gebruiken in hun klassen, functies en constanten om code-bases te scheiden. Dat staat gelijk aan het etiketteren van elkaars bezittingen en ze in één grote la te plaatsen. Natuurlijk, het is in ieder geval een soort organisatie, maar het is erg inefficiënt.

Namespacing tot de redding! U kunt dezelfde functie, klasse, interface en constante definities in afzonderlijke naamruimten declareren zonder fatale fouten te ontvangen. Essentialy, een naamruimte is niets meer dan een hiërarchisch gelabeld codeblok met gewone PHP-code.

Je gebruikt ze!

Het is belangrijk om in gedachten te houden dat u indirect gebruik maakt van naamruimten; Vanaf PHP 5.3 vallen alle definities die nog niet zijn gedeclareerd in een door de gebruiker gedefinieerde naamruimte onder de globale naamruimte.

De globale naamruimte bevat ook alle interne PHP-definities, zoals echo(), mysqli_connect (), en de Uitzondering klasse. Omdat de globale naamruimte geen unieke identificerende naam heeft, wordt deze meestal aangeduid als de globale ruimte.

Merk op dat het niet verplicht is om namespacing te gebruiken.

Je PHP-script werkt prima zonder hen, en dit gedrag gaat niet snel veranderen.


Een naamruimte definiëren

Een naamruimtedefinitie is de eerste instructie die de PHP-interpreter moet tegenkomen in een PHP-bestand. De enige verklaring die mag optreden boven een declaratie van de naamruimte is een verklaren statement, en nogmaals, alleen als het de codering van het script declareert.

Het declareren van een naamruimte is net zo eenvoudig als het gebruik van de namespace trefwoord. Een naamruimtenaam moet dezelfde regels volgen als andere ID's in PHP. Daarom moet een naamruimte begin met een letter of een onderstrepingsteken, gevolgd door een willekeurig aantal letters, cijfers of onderstrepingstekens.

 

Als u een codeblok wilt toewijzen aan de globale ruimte, gebruikt u de namespace sleutelwoord zonder een naam toe te voegen.

 

U mag meerdere naamruimten in hetzelfde bestand hebben.

 

U kunt dezelfde naamruimte in verschillende bestanden verspreiden; het proces van bestandsopname voegt ze automatisch samen. Daarom is het een goede codeermethode om de hoeveelheid naamruimtedefinities te beperken tot één per bestand, net zoals je zou doen met klassen.

Naamspacing wordt gebruikt om conflicterende definities te voorkomen en meer flexibiliteit en organisatie in uw codebasis te introduceren.

Merk op dat de haakjes rond het naamruimtecodeblok volledig optioneel zijn. Als u zich bijvoorbeeld houdt aan de regel met één regel naam per regel en de accolades weglaat, wordt uw code een stuk schoner - u hoeft de geneste code niet in te geven.

Sub-naamruimten

Namespaces kunnen een bepaalde hiërarchie volgen, net zoals de mappen in het bestandssysteem op uw computer. Sub-naamruimten zijn uitermate handig voor het organiseren van de structuur van een project. Als uw project bijvoorbeeld databasetoegang vereist, wilt u mogelijk alle databasegerelateerde code, zoals een database-uitzondering en verbindingshandler, in een subnaamruimte genaamd Database.

Om de flexibiliteit te behouden, is het verstandig om sub-namespaces op te slaan in submappen. Dit stimuleert de structurering van uw project en maakt het veel gemakkelijker om autoloaders te gebruiken die voldoen aan de PSR-0-standaard.

PHP gebruikt de backslash als naamruimteseparator.


Leuk feit: in de RFC om te beslissen welke naamruimteseparator moet worden gebruikt, hebben ze zelfs overwogen een smiley te gebruiken.
// myproject / database / connection.php  

U kunt zoveel sub-naamruimten als u wilt.

 

Het definiëren van subnaampaces met geneste codeblokken wordt niet ondersteund. In het volgende voorbeeld wordt een zeer beschrijvende fatale fout gegenereerd: "Namespace-declaraties kunnen niet worden genest".

 

Codes uit een naamruimte bellen

Als u een nieuw object wilt instantiëren, een functie wilt aanroepen of een constante wilt gebruiken uit een andere naamruimte, gebruikt u de backslash-notatie. Ze kunnen worden opgelost vanuit drie verschillende gezichtspunten:

  • Ongekwalificeerde naam
  • Gekwalificeerde naam
  • Volledig gekwalificeerde naam

Ongecertificeerde naam

Dit is de naam van een klasse, functie of constante zonder verwijzing naar een willekeurige naamruimte. Als namespacen nieuw voor u zijn, is dit het gezichtspunt waar u vanaf gewend bent.

 

Qualified Name

Dit is hoe we toegang krijgen tot de subnaamruimtehiërarchie; het maakt gebruik van de backslash-notatie.

 

Het onderstaande voorbeeld geeft een fatale fout: "Fatale fout: Klasse 'MyProject \ Database \ MyProject \ FileAccess \ Input' niet gevonden 'omdat MyProject \ FileAccess \ Input wordt benaderd ten opzichte van de naamruimte waar u zich momenteel bevindt.

 

Fully Qualified Name

De niet-gekwalificeerde en gekwalificeerde namen zijn allebei relatief ten opzichte van de naamruimte waar u zich momenteel bevindt. Ze kunnen alleen worden gebruikt om toegang te krijgen tot definities op dat niveau of om dieper in de naamruimtenhiërarchie te duiken..

Als u toegang wilt tot een functie, klasse of constante die zich op een hoger niveau in de hiërarchie bevindt, moet u de volledig gekwalificeerde naam gebruiken - een absoluut pad in plaats van een relatief pad. Dit komt neer op het voorbereiden van uw oproep met een backslash. Hiermee weet PHP dat deze oproep moet worden opgelost vanuit de globale ruimte in plaats van deze relatief te benaderen.

 

Het is niet vereist om de volledig gekwalificeerde naam van interne PHP-functies te gebruiken. Bellen niet-gekwalificeerde naam voor een constante of functie die niet bestaat in de naamruimte waar u momenteel in werkt, resulteert in PHP in het zoeken naar de globale naamruimte voor hen. Dit is een ingebouwde fallback die niet van toepassing is op niet-gekwalificeerde klassenamen.

Met dit in gedachten kunnen we nu de interne PHP-functies overbelasten, terwijl we toch de oorspronkelijke functie kunnen blijven gebruiken (of constant voor die kwestie).

'; 

Dynamische oproepen

PHP is een dynamische programmeertaal; dus je kunt deze functionaliteit ook toepassen voor het aanroepen van naamcode die is gewijzigd. Dit is in essentie hetzelfde als het instantiëren van variabele klassen of het opnemen van variabele bestanden. De naamruimteseparator die PHP gebruikt, is ook een metakarakter in tekenreeksen. Vergeet niet om de backslash te verlaten wanneer u een naamruimtenaam in een tekenreeks opslaat!

 

De namespace keyword

Niet alleen is het namespace sleutelwoord dat wordt gebruikt om een ​​naamruimte te definiëren, kan het ook worden gebruikt om expliciet op te lossen naar de huidige naamruimte, functioneel vergelijkbaar met de zelf trefwoord voor klassen.

 

De __NAMESPACE__ constante

Net als de zelf sleutelwoord kan niet worden gebruikt om te bepalen wat de huidige klassennaam is, de namespace sleutelwoord kan niet worden gebruikt om te bepalen wat de huidige naamruimte is. Dit is waarom we de __NAMESPACE__ constante.

 

Deze constante is erg handig om te leren als je net begint met namespaces; het is ook nuttig voor foutopsporing. Omdat het een string is, kan deze ook worden gebruikt in combinatie met dynamische codeaanroepen die we eerder hebben besproken.


Aliasing of importeren

"het is geen verplichting om namespacing te gebruiken"

Namespacing in PHP heeft ondersteuning voor importeren. Importeren wordt ook wel aangeduid als aliasing. Alleen klassen, interfaces en naamruimten kunnen aliased of geïmporteerd zijn.

Importeren is een zeer nuttig en fundamenteel aspect van namespacing. Het geeft je de mogelijkheid om gebruik te maken van externe codepakketten, zoals bibliotheken, zonder je zorgen te hoeven maken over conflicterende namen. Importeren wordt bereikt door de gebruik trefwoord. Optioneel kunt u een aangepaste alias opgeven met de zoals trefwoord.

gebruik [naam van klasse, interface of naamruimte] als [optional_custom_alias]

Hoe het gedaan wordt

Een volledig gekwalificeerde naam kan worden gealiast naar een kortere niet-gekwalificeerde naam, zodat u niet elke keer de volledige naam hoeft te schrijven wanneer u er gebruik van wilt maken. Aliasing of import moet plaatsvinden in het hoogste bereik van een naamruimte of in de globale scope. Dit proberen in het bereik van een methode of functie is ongeldige syntaxis.

 

Je kunt er ook een andere naam aan geven:

 

U kunt ook globale klassen importeren, zoals de Uitzondering klasse. Bij het importeren hoeft u de volledig gekwalificeerde naam niet meer te schrijven.

Merk op dat importnamen niet worden opgelost als relatief ten opzichte van de huidige naamruimte, maar vanuit een absoluut standpunt, beginnend bij de globale ruimte. Dit betekent dat een leidende backslash niet nodig is en niet wordt aanbevolen.

 

Hoewel het mogelijk is om naamcode met naamomzetting dynamisch aan te roepen, wordt dynamisch importeren niet ondersteund.

 

Conclusie

Naamspacing wordt gebruikt om conflicterende definities te voorkomen en meer flexibiliteit en organisatie in uw codebasis te introduceren. Vergeet niet dat u niet verplicht bent om namespacing te gebruiken; het is een functie die wordt gebruikt in combinatie met een objectgeoriënteerde workflow. Hopelijk, echter, zal je overwegen om je (toekomstige) PHP-project naar het volgende niveau te brengen door gebruik te maken van namespacing. Heb je al besloten?