Wat is een naamruimte. Klassen en naamruimten. Om dit te doen, moet u een volledig pad naar de bijlage maken

Zal helpen.
Het pad naar naamruimte-ondersteuning in PHP was een lastige. Gelukkig is het in PHP 5.3 aan de taal toegevoegd en is de structuur van de PHP-code sindsdien aanzienlijk verbeterd. Maar hoe gebruiken we ze precies?

Wat zijn naamruimten?

"Vergeet de backslash niet bij het opslaan van de naamruimtenaam als een string!"

Zie een naamruimte als een doos waarin je alles kunt doen wat je wilt: een potlood, een liniaal, een stuk papier, enzovoort. Dit zijn jouw spullen. Direct onder jouw bak staat de bak van iemand anders, en zijn baasje bewaart er dezelfde spullen in. Om te voorkomen dat je elkaars spullen gebruikt, heb je ervoor gekozen om de dozen te labelen zodat duidelijk is wat van wie is.

Voorheen moesten ontwikkelaars onderstrepingstekens gebruiken in hun klassen, functies en constanten om code te scheiden. Dit staat gelijk aan iedereen die zijn eigendommen labelt en ze in één grote doos bewaart. Natuurlijk is dit op zijn minst een soort organisatie, maar het is erg ineffectief.

Naamruimten helpen! U kunt dezelfde functie, klasse, interface declareren en een constante definiëren in afzonderlijke naamruimten zonder fatale fouten te krijgen. In de kern is een naamruimte niets meer dan hiërarchisch gelabelde codeblokken die reguliere PHP-code bevatten.

Je gebruikt ze!

Het is belangrijk om te begrijpen dat u naamruimten indirect gebruikt; Vanaf PHP 5.3 vallen alle definities die nog niet zijn gedeclareerd in door de gebruiker gedefinieerde naamruimten onder de algemene naamruimte.

De globale naamruimte slaat ook alle interne PHP-definities op, zoals mysqli_connect () en de Exception-klasse. Omdat de globale naamruimte geen unieke identificerende naam heeft, wordt deze meestal de globale naamruimte genoemd.

Merk op dat het gebruik van de naamruimte optioneel is.
Je PHP-script werkt prima zonder hen, en dit gedrag zal niet snel veranderen.

Naamruimtedefinitie

Het bestand dat de naamruimte bevat, moet zijn declaratie aan het begin bevatten, vóór elke andere code. Het enige dat vóór de naamruimte kan worden gedeclareerd, is het gereserveerde woord declare, de declare-expressie kan vóór de naamruimtedeclaratie verschijnen om de bestandscodering aan te geven.

Naamruimten worden gedeclareerd met het gereserveerde woord voor de naamruimte. Naamruimten volgen dezelfde regels als andere identifiers in PHP. Dus de naamruimte zou moeten beginnen met een letter of underscore gevolgd door een willekeurig aantal letters, cijfers of underscores.

Als u een codeblok in de globale ruimte wilt definiëren, kunt u het trefwoord namespace gebruiken zonder een naam toe te voegen.

U kunt meerdere naamruimten in één bestand gebruiken.

U kunt dezelfde naamruimte ook voor verschillende bestanden gebruiken; het bestandsverbindingsproces zal ze automatisch samenvoegen. Het is een goede coderingspraktijk om het aantal naamruimtedefinities te beperken tot een enkel bestand, net zoals u zou doen met klassen.

De naamruimte wordt gebruikt om conflicterende definities te voorkomen en om meer flexibiliteit en organisatie in uw code te introduceren.

Merk op dat accolades volledig optioneel zijn. Door de regel van één naamruimte in één bestand te gebruiken en de accolades weg te laten, maakt u uw code veel schoner - het is niet nodig om de geneste code te laten inspringen (tabblad).

Naamruimten

Naamruimten kunnen een specifieke hiërarchie volgen, net als mappen in het bestandssysteem op een computer. Naamruimten zijn uitermate handig voor het organiseren van de structuur van een project. Als uw project bijvoorbeeld databasetoegang vereist, kunt u uw database-uitzonderingshandler en verbindingshandlercode in de subnaamruimte Database plaatsen.

Voor flexibiliteit is het verstandig om geneste naamruimten in submappen op te slaan. Dit helpt om het project te structureren en maakt het veel gemakkelijker te gebruiken voor autoloaders die de PSR-4-standaard volgen.

PHP gebruikt een backslash als scheidingsteken voor de naamruimte.

Leuk weetje: de RFC heeft gekeken naar het gebruik van een emoticon om te beslissen welk naamruimtescheidingsteken moet worden gebruikt.

// mijnproject / database / verbinding.phpU kunt zoveel geneste naamruimten gebruiken als u wilt.

Het definiëren van een subnaamruimte met geneste codeblokken wordt niet ondersteund. Het volgende voorbeeld retourneert een fatale fout: "Naamruimtedeclaraties kunnen niet worden genest."

Belcode uit naamruimte

Als u een nieuwe instantie van een object wilt maken, een functie wilt aanroepen of constanten uit verschillende naamruimten wilt gebruiken, gebruikt u een backslash. Er zijn drie soorten naamruimtenaamdefinities:
  • ongekwalificeerde naam
  • Volledige naam (gekwalificeerde naam)
  • Volledig gekwalificeerde naam

onvolledige naam

Dit is de naam van een klasse, functie of constante en bevat geen verwijzing naar een naamruimte. Voor degenen die nieuw zijn bij naamruimten, is dit een bekend standpunt.

Voor-en achternaam

Dit is hoe we toegang krijgen tot de subnaamruimtehiërarchie; gescheiden door een backslash.

Het onderstaande voorbeeld retourneert een fatale fout: "Fatale fout: Klasse" MyProject \ Database \ MyProject \ FileAccess \ Input "not found" omdat MyProject \ FileAccess \ Input geen relatie heeft met de naamruimte waarin u zich bevindt.

Absolute naam

Volledige en gedeeltelijke namen worden gebruikt in relatie tot de naamruimte waarin u zich momenteel bevindt. Ze kunnen alleen worden gebruikt om toegang op dat niveau te definiëren, of om dieper in de naamruimtehiërarchie te duiken.

Als u toegang wilt tot een functie, klasse of constante die zich op een hoger niveau van de hiërarchie bevindt, moet u de volledige naam gebruiken - een absoluut pad, geen relatief pad. De oproep moet beginnen met een backslash. Dit stelt PHP in staat om te begrijpen dat deze aanroep moet worden gedaan vanuit de globale ruimte, en er niet naar moet verwijzen ten opzichte van uw huidige positie.

We hoeven de volledig gekwalificeerde naam niet te gebruiken voor interne PHP-functies. Niet-gekwalificeerde namen voor functies en constanten worden gedefinieerd in de algemene naamruimte als ze niet zijn gedefinieerd in de huidige naamruimte.

Dit wetende, kunnen we nu de interne functies van PHP overbelasten terwijl we nog steeds de originele functie (of constante) kunnen aanroepen.

"; }

Dynamische oproepen

PHP is een dynamische programmeertaal; dus je kunt deze functionaliteit gebruiken om code aan te roepen vanuit de naamruimte. Dit is in wezen hetzelfde als het gebruik van een dynamische klassenaam of het opnemen van een dynamisch bestand met een variabele om de naam op te slaan. Het PHP-naamscheidingsteken gebruikt dezelfde metatekens in strings. Vergeet de backslash niet bij het opslaan van de naamruimtenaam als een string!

Naamruimte trefwoord

Het namespace-sleutelwoord wordt niet alleen gebruikt om een ​​naamruimte te definiëren, het kan ook worden gebruikt om de huidige naamruimte aan te roepen, functioneel vergelijkbaar met het self-sleutelwoord voor klassen.

__NAMESPACE__ constante

Net zoals het sleutelwoord self niet kan worden gebruikt om de naam van de huidige klasse te definiëren, kan het sleutelwoord namespace niet worden gebruikt voor de huidige naamruimte. Daarom gebruiken we de constante __NAMESPACE__

Deze constante is erg handig wanneer u de naamruimte gaat verkennen; het is ook erg handig voor het debuggen. Omdat het een string is, kan het worden gebruikt in combinatie met de hierboven besproken dynamische code-aanroepen.

Een aliasnaam importeren of maken

niet vereist voor gebruik in naamruimten

Een belangrijk kenmerk van naamruimten in PHP is de mogelijkheid om naar een externe absolute naam te verwijzen door: alias, of importeren.

Importeren is een zeer nuttig en fundamenteel aspect van de naamruimte. Dit geeft je de mogelijkheid om externe pakketten zoals bibliotheken te gebruiken zonder je zorgen te maken over naambotsingen. Het importeren wordt uitgevoerd met behulp van het trefwoord use. Optioneel kunt u een aangepaste alias specificeren met het as-sleutelwoord.

Gebruik als

Hoe te gebruiken

Een absolute naam kan worden gekoppeld aan een kortere, onvolledige naam, zodat u de absolute naam niet elke keer hoeft te schrijven als u deze wilt gebruiken. Het maken of importeren van aliassen moet plaatsvinden in de bovenliggende naamruimte of in de global. Als u dit binnen een methode of functie probeert te doen, is de syntaxis ongeldig.

Een alternatief is de mogelijkheid om een ​​alias met een andere naam toe te wijzen

U kunt ook globale klassen zoals Exception importeren. Bij het importeren hoeft u de absolute naam niet te schrijven.

Merk op dat er geen voorafgaande backslash nodig is voor namen in een naamruimte, en de aanwezigheid ervan wordt niet aanbevolen, aangezien geïmporteerde namen absoluut moeten zijn en niet worden verwerkt ten opzichte van de huidige naamruimte.

Hoewel er ondersteuning is voor het dynamisch aanroepen van de naamruimte, wordt dynamische import niet ondersteund.

Uitgang:

Naamruimten worden gebruikt om definitieconflicten te voorkomen en om meer flexibiliteit en organisatie in uw code te introduceren. Onthoud dat u geen naamruimten hoeft te gebruiken; deze functie wordt gebruikt in combinatie met een objectgeoriënteerde benadering. Hopelijk wil je overwegen om je (toekomstige) PHP-project naar een hoger niveau te tillen door een namespace te gebruiken.

Laten we zeggen dat we onze Array-klasse die in de vorige voorbeelden is ontwikkeld, willen delen. We waren echter niet de enige die dit probleem aanpakten; misschien is er ergens, laten we zeggen, iemand in een van de divisies van Intel een klasse met dezelfde naam gecreëerd. Omdat de namen van deze klassen hetzelfde zijn, kunnen potentiële gebruikers niet beide klassen tegelijkertijd gebruiken, ze moeten er een kiezen. Dit probleem wordt opgelost door een regel toe te voegen aan de klassenaam die de ontwikkelaars identificeert, laten we zeggen:

Klasse Cplusplus_Primer_Third_Edition_Array (...);

Dit garandeert natuurlijk ook niet de uniciteit van de naam, maar het zal de gebruiker hoogstwaarschijnlijk van dit probleem redden. Hoe lastig is het echter om zulke lange namen te gebruiken!
De C++ standaard biedt een mechanisme om het naam match probleem op te lossen genaamd naamruimte... Elke softwareleverancier kan hun klassen, functies en andere objecten in hun eigen naamruimte inpakken. Zo ziet onze Array class-declaratie er bijvoorbeeld uit:

Naamruimte Cplusplus_Primer_3E (sjabloon klasse Array (...); )

Het sleutelwoord namespace specificeert de naamruimte die de zichtbaarheid van onze klasse definieert en heet in dit geval Cplusplus_Primer_3E. Stel dat we klassen van andere ontwikkelaars in verschillende naamruimten hebben geplaatst:

Naamruimte IBM_Canada_Laboratory (sjabloon klasse Array (...);
klasse Matrix (...);
}
naamruimte Disney_Feature_Animation (
klasse Punt (...);
sjabloon klasse Array (...);
}

Standaard ziet het programma objecten die zijn gedeclareerd zonder expliciet een naamruimte op te geven; ze verwijzen naar globaal naamruimte. Om naar een object uit een andere ruimte te verwijzen, moet u de gekwalificeerde naam gebruiken, die bestaat uit de naamruimte-ID en de object-ID, gescheiden door de scope-resolutie-operator (: :). Zo ziet het object dat in de bovenstaande voorbeelden wordt aangeroepen eruit:

Cplusplus_Primer_3E :: Array tekst; IBM_Canada_Laboratory :: Matrixmat; Disney_Feature_Animation :: Punt oorsprong (5000,5000);

Voor gebruiksgemak kunt u aliassen toewijzen aan naamruimten. De bijnaam is kort gekozen en gemakkelijk te onthouden. Bijvoorbeeld:

// aliassen naamruimte LIB = IBM_Canada_Laboratory; naamruimte DFA = Disney_Feature_Animation;
int hoofd ()
{
LIB :: Array oa (1024);
}

Aliassen worden ook gebruikt om het gebruik van naamruimten te verbergen. Door de alias te vervangen, kunnen we de set van functies en klassen veranderen, en in alle andere opzichten blijft de programmacode hetzelfde. Door slechts één regel in het bovenstaande voorbeeld te corrigeren, krijgen we de definitie van een geheel andere array:

Naamruimte LIB = Cplusplus_Primer_3E; int main () (LIB :: Array oa (1024); )

Om dit mogelijk te maken, is natuurlijk een exacte overeenkomst nodig tussen de interfaces van de klassen en functies die in deze naamruimten zijn gedeclareerd. Stel je voor dat de Array-klasse van Disney_Feature_Animation geen constructor heeft met één parameter - grootte. Dan zal de volgende code een foutmelding geven:

Naamruimte LIB = Disney_Feature_Animation;
int hoofd ()
{
LIB :: Array oa (1024);
}

Nog handiger is de manier om een ​​eenvoudige, niet-gekwalificeerde naam te gebruiken om te verwijzen naar objecten die in een naamruimte zijn gedefinieerd. Hiervoor is een gebruiksrichtlijn:
#include "IBM_Canada_Laboratory.h"

Naamruimte IBM_Canada_Laboratory gebruiken;
int hoofd ()
{
Matrixmat (4.4);
// IBM_Canada_Laboratory :: Array
Array oa (1024);
// ...
}

De naamruimte IBM_Canada_Laboratory wordt zichtbaar in het programma. Het is mogelijk om niet de hele ruimte zichtbaar te maken, maar individuele namen erin (selectief met behulp van richtlijn):

#include "IBM_Canada_Laboratory.h" met de naamruimte IBM_Canada_Laboratory :: Matrix;
// alleen Matrix wordt zichtbaar
int hoofd ()
{
// IBM_Canada_Laboratory :: Matrix
Matrixmat (4.4); // Fout: IBM_Canada_Laboratory :: Array is onzichtbaar
Array oa (1024);
// ... }

Zoals we al zeiden, worden alle componenten van de C++-standaardbibliotheek gedeclareerd in de std-naamruimte. Daarom is het simpelweg opnemen van het headerbestand niet voldoende om de standaardfuncties en klassen direct te gebruiken:

#erbij betrekken // fout: string is onzichtbaar

U moet de gebruiksrichtlijn gebruiken:

#erbij betrekken namespace std; gebruiken; // Ok: we zien string
string current_chapter = "C++ Overzicht";

Merk echter op dat we op deze manier terugkeren naar het probleem van het "verstoppen" van de globale naamruimte, om op te lossen waarvoor het mechanisme van benoemde ruimten werd gecreëerd. Daarom is het beter om ofwel een gekwalificeerde naam te gebruiken:

#erbij betrekken // correct: gekwalificeerde naam std :: string current_chapter = "C ++ Overzicht"; of een selectieve gebruiksrichtlijn: #include met behulp van naamruimte std :: string; // Ok: string zichtbaar
string current_chapter = "C++ Overzicht";

We raden aan om de laatste methode te gebruiken.
In de meeste voorbeelden in dit boek zijn naamruimterichtlijnen weggelaten. Dit is gedaan om de code te verkleinen en ook omdat de meeste voorbeelden zijn gecompileerd met een compiler die geen naamruimten ondersteunt - een vrij recente innovatie in C++. (De details van het gebruik van declaraties bij het werken met de C++ standaardbibliotheek worden besproken in paragraaf 8.6.)
In de volgende hoofdstukken zullen we nog vier klassen maken: String, Stack, List en de Stack-modificatie. Ze worden allemaal verpakt in één naamruimte - Cplusplus_Primer_3E. (Zie hoofdstuk 8 voor meer informatie over het werken met naamruimten.)

Oefening 2.21

Gegeven een naamruimte

Naamruimte-oefening (sjabloon klasse Array (...);
sjabloon
ongeldige afdruk (array< EType >);
klasse String (...)
sjabloon
klassenlijst (...);
}

en de tekst van het programma:

Int main () (const int size = 1024; Array als (maat); Lijst il (maat);
// ...
Array * pas = nieuwe array (als);
Lijst * pil = nieuwe lijst (il);
afdrukken (* pas);
}

Het programma compileert niet omdat de klassendeclaraties die in gebruik zijn verpakt zijn in de naamruimte Oefening. Wijzig de programmacode met
(a) gekwalificeerde namen
(b) selectief gebruik van richtlijn
(c) aliasmechanisme
(d) met behulp van richtlijn

annotatie: Deze sectie beschrijft het gebruik en de declaratie van naamruimten. Basiskenmerken van RDF, XML-Data, Document Content Description (DCD), Schema for Object-Oriented XML (SOX), Document Definition Markup Language (DDML, voorheen XSchema) worden gegeven.

We hebben eerder enkele van de nadelen van DTD-definities beschreven, ze zijn gerelateerd:

  1. de syntaxis van deze definities verschilt van de syntaxis van XML (met name de zogenaamde extended Backus-Naur vorm, Uitgebreide Backus Naur Form);
  2. deze definities zijn niet expressief genoeg;
  3. aangezien elke gebruiker zijn eigen tags kan maken, is het zeer waarschijnlijk dat mensen dezelfde elementnamen zullen gebruiken om naar verschillende dingen te verwijzen. Zelfs als de betekenissen van de elementen hetzelfde zijn, kan hun mogelijke inhoud variëren afhankelijk van de definitie. We hebben dus een manier nodig om het specifieke gebruik van een element te definiëren, vooral als we verschillende soorten vocabulaires in hetzelfde document combineren. Om dit probleem aan te pakken, heeft het W3C een specificatie uitgebracht met de naam XML-naamruimten waarmee u de context van een element in een naamruimte kunt definiëren.
  4. er zijn situaties waarin u XML-documenten uit verschillende bronnen moet combineren die overeenkomen met verschillende DTD-definities. Deze situatie doet zich bijvoorbeeld voor bij het beschrijven van een grote hoeveelheid informatie, als individuele DTD's niet voldoende zijn om het hele volume te dekken of als ze moeilijk te begrijpen zijn. Het komt ook voor in e-commercesystemen wanneer u probeert de gegevens van uw zakenpartner te combineren met die van u. Er kan zich ook een situatie voordoen waarin u alleen uw instellingen aan een bestaande DTD hoeft toe te voegen om wat informatie in een standaardformaat uit te wisselen. Helaas biedt de XML-aanbeveling geen manier om meerdere DTD's in hetzelfde document te combineren zonder ze te wijzigen of een nieuwe DTD te maken (met behulp van externe links).

Dit hoofdstuk behandelt de volgende twee concepten: naamruimte en XML-schema's. Met naamruimten kunnen XML-ontwikkelaars een complex probleem opsplitsen in kleine stukjes en meerdere vocabulaires combineren in een enkel document om het volledig te beschrijven. Woordenboekontwerpers gebruiken schema's om preciezere definities te creëren dan de DTD kan doen, met behulp van XML-syntaxis.

Deze twee tools helpen u bij het oplossen van de complexe problemen bij het gebruik van XML. Met naamruimten en schema's kunnen XML-ontwerpers en programmeurs:

  • Woordenboeken beter organiseren om complexe problemen op te lossen;
  • Houden sterk typen gegevens bij het converteren van en naar XML;
  • Beschrijf vocabulaires nauwkeuriger en flexibeler dan mogelijk was met DTD's;
  • Lees de woordenboekregels in XML en krijg toegang tot de definities zonder de parser ingewikkeld te maken.

Woordenboeken mixen

Bij het ontwerpen van een vocabulaire kan het zinvol zijn om een ​​globaal probleem op te splitsen in verschillende onderdelen. Dit vereist manieren om een ​​groot probleem in meerdere vocabulaires te segmenteren. Het echte probleem dat moet worden aangepakt, is echter het samenvoegen van afzonderlijke DTD's in de hoofdtekst van één enkel document. Dit probleem kan zich ook voordoen als u bijvoorbeeld werkt voor een bedrijf waarin waarschijnlijk al een set DTD's bestaat en het gebruik ervan het werk aanzienlijk kan vergemakkelijken, omdat ze het probleem beschrijven zoals anderen het begrijpen. Het is vaak ook nuttig om DTD-definities te hergebruiken, d.w.z. gebruik van gemeenschappelijke constructies van eerder gemaakte DTD-definities. Als je een applicatie ontwikkelt die moet communiceren met programma's van een externe partner, heb je weinig of geen andere keuze dan bestaande concepten te hergebruiken. De bestaande definities van DTD's vormen een gemeenschappelijke taal die moet worden gesproken om te worden begrepen. Als een concept al bestaat, moet men zo werken dat het in termen van dat concept wordt begrepen.

Wanneer u definities van DTD's van andere ontwikkelaars gebruikt die nuttig voor u zijn, of shard-DTD's combineert om een ​​document te maken dat een complex probleem beschrijft, en uw documenten elementen met dezelfde naam gebruiken, loopt u het risico op verwarring en naamconflicten.

Het probleem wordt nog verergerd bij het gebruik van instanties van namen uit meerdere DTD's. In dit geval weten we niet naar welk element, welke DTD-definitie verwijst, zo'n probleem van goed gevormde documenten ambiguïteit genoemd. Bovendien, als de namen uit het document vereisen: geldigmaking, kunnen we onze applicatie erg "verwarren". Dit probleem wordt naambotsing genoemd.

Naamruimten

Naamruimten kunnen de gebruiker helpen in twee zeer belangrijke gevallen. Met hun hulp kunt u:

  • documenten uit twee of meer bronnen combineren, zonder het vertrouwen te verliezen dat het programma zal onderscheiden van welke bron dit of dat element of attribuut afkomstig is;
  • waar mogelijk, geef de user-agent toegang tot meer materiaal, zoals een documenttypedefinitie (DTD) of een andere beschrijving van elementen en attributen.

Een namespace is een verzameling van bepaalde waarden of kenmerken die gebruikt kunnen worden als element- of attribuutnamen in XML-documenten. Naamruimten in XML worden gedefinieerd door een Uniform Resource Identifier (URI) (u kunt de DTD op uw server gebruiken als de URI). Hierdoor kan elke naamruimte uniek zijn.

Dus om naamruimten effectief te gebruiken in een document waarin elementen uit verschillende bronnen worden gecombineerd, moeten we het volgende definiëren:

  • Een verwijzing naar een URI die het gebruik van het element beschrijft.
  • Een alias waarmee we kunnen begrijpen uit welke naamruimte ons element is gehaald. Deze alias heeft de vorm van een elementprefix (als de alias voor het obscure Book-element bijvoorbeeld catalog is, krijgt het element de naam ).

Naamruimten gebruiken en declareren

Naamruimtedeclaratie

Omdat verschillende opmaaktalen - XML-implementaties - dezelfde namen van tags en hun attributen kunnen bevatten, die totaal verschillende betekenissen hebben, moet je ze op de een of andere manier kunnen onderscheiden. Hiervoor worden de namen van tags en attributen voorzien van een kort voorvoegsel, dat van de naam wordt gescheiden door een dubbele punt. Het naamvoorvoegsel is gekoppeld aan een identifier die de naamruimte definieert. Alle tag- en attribuutnamen met voorvoegsels die aan dezelfde identifier zijn gekoppeld, vormen een enkele naamruimte waarin de namen uniek moeten zijn.

Omdat we willen dat iedereen de naamruimtedeclaratie kan herkennen wanneer ze deze tegenkomen, reserveren we er een speciaal woord voor. Volgens de aanbeveling voor de naamruimte is dit woord xmlns. De kenmerkwaarde is een URI die de naamruimte identificeert die moet worden gebruikt. Dit is vaak de URL van de DTD-definitie, maar dat hoeft niet altijd. Het naamruimtevoorvoegsel en de id worden als volgt gedefinieerd door het xmlns-kenmerk:

Zoals u kunt zien, is het ntb-voorvoegsel zojuist gedefinieerd, maar het kan al worden gebruikt in de ntb: notebooknaam. In wat volgt, worden de namen van tags en attributen waarnaar we willen verwijzen naar de http://some.firm.com/2003/ntbml-naamruimte voorafgegaan door ntb, bijvoorbeeld:

Gorelov

Bovendien kunnen er meerdere naamruimten in dezelfde tag voorkomen. Het volgende is een voorbeeld van het mengen van meerdere naamruimten:

Het boekelement komt uit de catalogusnaamruimte en het ISBN-kenmerk komt uit de volgorde.

De naam samen met een voorvoegsel, bijvoorbeeld

een uitgebreide, gekwalificeerde of gekwalificeerde naam genoemd (OName. Qualified Name). Het deel van de naam dat na de dubbele punt wordt geschreven, wordt het lokale deel van de naam genoemd.

De nomenclatuur van namen voor webbronnen kan verwarrend zijn. Uniform Resource Locator ( Uniform Resource Locator, URL) geeft een bron aan in termen van toegangsprotocol en netwerklocatie. Uniform resource-ID ( Uniform Resource Identifier, URI) is een unieke naam voor een bron. Zie URI's eenvoudig als een unieke tekenreeks die een naamruimte identificeert.

Volgens de regels van SGML en XML kan een dubbele punt in namen worden gebruikt als een normaal teken, dus een naam met een voorvoegsel is gewoon een truc, elk programma dat de naamruimte "niet kent", bij het analyseren van een document, behandelt de gekwalificeerde naam als een algemene naam. Dit houdt in het bijzonder in dat in document type aangifte(Document Type Declaration) naamprefixen kunnen niet worden weggelaten.

Het xmlns-attribuut kan op elk XML-element voorkomen, niet alleen op de root. Het voorvoegsel dat het definieert, kan worden toegepast op het element waarin het xmlns-attribuut is geschreven en op alle geneste elementen. Bovendien kunnen in één element meerdere namespaces worden gedefinieerd.

In geneste elementen kan de naamruimte worden overschreven door het voorvoegsel te associëren met een andere identifier.

Het verschijnen van een niet-voorgevoegde tagnaam in een document met een naamruimte betekent dat de naam tot de standaardnaamruimte behoort.

Een goed ontworpen document moet naamruimten gebruiken voor al zijn elementen.

Prefixen die beginnen met xml-tekens zijn in ieder geval gereserveerd voor XML zelf. Het xmlns-voorvoegsel wordt gebruikt om een ​​ander, aangewezen, voorvoegsel te associëren met zijn naamruimte-ID. Het xmlns-voorvoegsel hoeft niet te worden gedefinieerd, het wordt geïntroduceerd door de aanbeveling "Naamruimten in XML" en wordt daar gekoppeld aan de naamruimte-ID http://www.w3.ori/2000 / xmlns /.

Een ander voorvoegsel, xml, is in dezelfde aanbeveling gekoppeld met een identifier http://www.w3.org/XML/1998/namespace... Het hoeft ook niet te worden gedefinieerd in het XML-document. Er kan geen ander voorvoegsel aan deze ID's worden gekoppeld. Preserve geeft de instructie om de witruimte intact te houden. Dit is van belang voor sommige teksten, zoals programmacodes. De standaardwaarde laat witruimte naar goeddunken van het handlerprogramma.

Domein

Naamruimtedeclaraties vallen binnen het bereik, net als variabeledeclaraties in programmeertalen. Dit is belangrijk omdat naamruimten niet altijd aan het begin van een XML-document worden gedeclareerd, soms in latere secties. De naamruimtedeclaratie is van toepassing op het element waarin het voorkomt, evenals op de afstammelingen van dat element, zelfs als het daar niet expliciet is gedefinieerd. Een naam kan alleen verwijzen naar een naamruimte als deze wordt gebruikt binnen de reikwijdte van zijn declaratie.

We moeten echter ook naamruimtebereiken mengen in elementen die anders zouden erven van andere naamruimten. Daarom zijn er twee manieren om het bereik te declareren: standaard en gekwalificeerd.

Standaard bereik

Zoals je zou verwachten, wordt het al snel vervelend om een ​​voorvoegsel aan elke naam in een document toe te voegen. Door het begrip naambereik te introduceren, kunnen we in feite een groot aantal voorvoegsels in ons document door elkaar halen. Als we een standaardnaamruimte definiëren, wordt aangenomen dat deze de eigenaar is van alle niet-gekwalificeerde namen binnen de reikwijdte van zijn declaratie. De standaard naamruimte die in het root-element is gedeclareerd, wordt dus beschouwd als de standaard voor het hele document en kan alleen worden overschreven door de meer specifieke naamruimte die in het document is gedeclareerd.

Om van een naamruimte de standaardnaamruimte voor een bereik te maken, volstaat het om de prefixdeclaratie weg te laten.

Als een prefix wordt gedeclareerd en vervolgens wordt gebruikt in combinatie met een naam, wordt de naamruimte expliciet ingesteld. Als u een niet-gekwalificeerde naam aan een naamruimte wilt toewijzen, moet u een standaardruimte declareren die die niet-gekwalificeerde naam bevat (geen prefix).

Gekwalificeerd bereik

De bovenstaande methode werkt goed als u uw naamruimten duidelijk kunt scheiden. Soms is het echter nodig om individuele namen uit externe naamruimten in een document op te nemen. In plaats van naamruimten voor een volledig bereik te declareren, kunt u gekwalificeerde namen gebruiken. Declareer de gewenste naamruimten aan het begin van het document en kwalificeer ze vervolgens op het punt van gebruik.