Co je jmenný prostor v c. Třídy a jmenné prostory. Volání kódu z jmenného prostoru

Třídy a jmenné prostory

Třídy .NET Framework

Snad největší výhodou psaní spravovaného kódu – alespoň z pohledu vývojáře – je to, že ho můžete používat Knihovna základních tříd .NET .

Třídy jádra .NET poskytují obrovskou sbírku tříd spravovaného kódu, které vám umožňují vyřešit téměř jakýkoli problém, který bylo možné dříve vyřešit pomocí Windows API. Všechny tyto třídy se řídí stejným objektovým modelem IL s jedinou dědičností. To znamená, že můžete buď vytvářet objekty z libovolné základní třídy .NET, nebo z nich zdědit své vlastní třídy.

Základní třídy .NET se liší tím, že jsou navrženy tak, aby byly intuitivní a snadno použitelné. Chcete-li například spustit vlákno, musíte zavolat metodu Start() třídy Vlákno. Chcete-li, aby objekt TextBox nebyl dostupný, nastavte vlastnost Enabled objektu na hodnotu false. Tento přístup známý vývojářům Visual Basic a Java, jejichž knihovny se stejně snadno používají, bude obrovskou úlevou pro vývojáře v C++, kteří strávili roky bojem s funkcemi API, jako jsou GetDIBits(), RegisterWndClassEx() a IsEqualIID(). stejně jako mnoho funkcí, které vyžadovaly předávání okenních klik.

Vývojáři v C++ však měli vždy snadný přístup ke kompletní sadě Windows API, zatímco vývojáři Visual Basic 6 a Java byli omezeni na základní funkce operačního systému, ke kterým přistupují ze svých jazyků. Základní třídy .NET kombinují snadnost použití knihoven Visual Basic a Java s relativně úplným pokrytím sady funkcí Windows API. Mnoho funkcí Windows není přístupných prostřednictvím základních tříd a v těchto případech se budete muset uchýlit k funkcím API, ale obecně to platí pouze pro ty nejexotičtější funkce. Pro každodenní použití bude obecně postačovat sada základních tříd. Pokud ale potřebujete volat funkci API, pak .NET poskytuje tzv mechanismus vyvolání platformy, který zaručuje správnou konverzi datových typů, takže nyní tento úkol není o nic těžší než volání těchto funkcí přímo z kódu C++, bez ohledu na to, v jakém jazyce je kód napsán – C#, C++ nebo Visual Basic 2010.

Jmenné prostory

Jmenné prostory je způsob, kterým se .NET vyhýbá konfliktům pojmenování mezi třídami. Mají zabránit situacím, kdy definujete třídu, která reprezentuje zákazníka, nazvete ji Customer a pak někdo jiný udělá to samé (toto je poměrně běžný scénář).

Jmenný prostor není nic jiného než skupina datových typů, ale má za následek, že názvy všech datových typů v rámci jmenného prostoru jsou automaticky opatřeny předponou jménem jmenného prostoru. Jmenné prostory mohou být vnořeny do sebe. Například většina základních tříd .NET pro obecné účely se nachází v oboru názvů Systém. Základní třída Pole odkazuje na tento prostor, takže jeho celý název je System.Array.

Platforma .NET vyžaduje, aby všechna jména byla deklarována v rámci jmenného prostoru; můžete například zadat svou třídu Moje třída do jmenného prostoru Moje společnost. Pak bude vypadat celý název této třídy MyCompany.MyClass.

Všimněte si, že pokud jmenný prostor není specifikován explicitně, typ bude přidán do nepojmenovaného globálního jmenného prostoru.

Ve většině situací Microsoft doporučuje používat alespoň dva vnořené jmenné prostory: první je název vaší společnosti a druhý je název technologie nebo softwarového balíčku, ke kterému třída patří, takže vypadá asi takto: MyCompany.SomeNamespace .Moje třída. Ve většině případů tento přístup ochrání třídy vaší aplikace před potenciálními konflikty s názvy tříd napsanými vývojáři z jiných společností.

Následující tabulka je krátkým seznamem některých (ale určitě ne všech) jmenných prostorů nabízených v .NET, které byly rozděleny do skupin podle funkčnosti:

Klíčové jmenné prostory .NET Framework
Jmenný prostor v .NET Popis
Systém Uvnitř jmenného prostoru Systém obsahuje mnoho užitečných typů pro práci s interními daty, matematikou, generováním náhodných čísel, proměnnými prostředí a sběrem odpadků, stejně jako řadu běžně používaných výjimek a atributů
Systém. Kolekce
System.Collections.Generic
Tyto jmenné prostory obsahují řadu typů kontejnerů a také několik základních typů a rozhraní, která vám umožňují vytvářet speciální kolekce
System.Data
System.Data.Common
System.Data.EntityClient
System.Data.SqlClient
Tyto jmenné prostory se používají k interakci s databázemi pomocí ADO.NET
System.IO
System.IO.Compression
System.IO.Ports
Tyto prostory obsahují mnoho typů navržených pro zpracování I/O souborů, kompresi dat a manipulaci s porty.
Systém.Reflexe
System.Reflection.Emit
Tyto obory názvů obsahují typy, které podporují zjišťování typů za běhu a také dynamické vytváření typů
System.Runtime.InteropServices Tento jmenný prostor obsahuje prostředky, kterými můžete typům .NET umožnit interakci s „nespravovaným kódem“ (jako jsou knihovny DLL založené na C a servery COM) a naopak.
Systém.Výkres
System.Windows.Forms
Tyto jmenné prostory obsahují typy používané k vytváření desktopových aplikací pomocí nativní sady grafických nástrojů .NET (Windows Forms).
System.Windows
Ovládací prvky systému.okna
System.Windows.Shapes
Prostor System.Windows je kořenem mezi těmito několika jmennými prostory, které představují sadu grafických nástrojů Windows Presentation Foundation (WPF)
System.Linq
System.Xml.Linq
System.Data.DataSetExtensions
Tyto jmenné prostory obsahují typy, které se používají při programování pomocí LINQ API
System.Web Tento jmenný prostor je jedním z mnoha, které vám umožňují vytvářet webové aplikace ASP.NET
System.ServiceModel Tento jmenný prostor je jedním z mnoha, které můžete použít k vytváření distribuovaných aplikací pomocí rozhraní Windows Communication Foundation (WCF) API.
System.Workflow.Runtime
System.Workflow.Activities
Tyto dva obory názvů jsou hlavními představiteli mnoha oborů názvů, které obsahují typy používané k vytváření aplikací podporujících pracovní postup pomocí rozhraní API Windows Workflow Foundation (WWF).
System.Threading
System.Threading.Tasks
Tento obor názvů obsahuje mnoho typů pro vytváření vícevláknových aplikací, které mohou rozložit zátěž mezi více CPU.
Systém. Zabezpečení Bezpečnost je neodmyslitelnou součástí světa .NET. Jmenné prostory související se zabezpečením obsahují mnoho typů, které se zabývají oprávněními, kryptografickým zabezpečením atd.
System.Xml Tento jmenný prostor orientovaný na XML obsahuje četné typy, které lze použít k interakci s daty XML

Role kořenového prostoru Microsoftu

Při zkoumání seznamu v tabulce bylo snadné si všimnout, že jmenný prostor System je kořenem slušného počtu vnořených jmenných prostorů (jako System.IO, System.Data atd.). Jak se však ukazuje, kromě System nabízí knihovna základních tříd také řadu dalších kořenových jmenných prostorů nejvyšší úrovně, z nichž nejužitečnější je jmenný prostor společnosti Microsoft.

Abychom odpověděli na otázku, co je použití jmenného prostoru std, je třeba nejprve poznamenat, že v překladu z angličtiny znamená termín popis jmenný prostor, což je rozsah deklarace, nutné k definování různých identifikačních forem: funkce a závislé/nezávislé proměnné.

Díky tomu nedochází ke konfliktu mezi názvy, protože nastávají situace, kdy více proměnných nabývá stejných hodnot. Obvykle se to stane, když jsou vytvořeny různé knihovny.

Identifikátory jsou ve vzájemném vztahu volně dostupné. Při použití formátu celého jména získávají bezplatný přístup k nezávislým členům.

K tomu je to nesmírně důležité tak, aby objekt obsahoval úplný tvar jména pomocí jmenného prostoru std. To je důležité pro vizuální pochopení toho, jak deklarace vypadá, když je umístěna do názvu prostoru.

Obrázek ukazuje několik variant přístupu ke kódování, umístěné uvnitř a za jeho ploty:

1 Takhle to vypadá celé jméno:

2 Za účelem doplnění stávajícího inzerátu, přidat pomocí:

3 Chcete-li přidat všechna stávající ID, použijte příslušnou směrnici:

Použití směrnice

Direktiva using umožňuje využívat všechna dostupná jména, která jsou zahrnuta v jmenném prostoru.

Není třeba uvádět kvalifikátor.

Musíte použít v souboru formátu cpp. Důležitou podmínkou je však přítomnost několika identifikátorů.

V případě, že existuje pouze několik jmen, bude důležité vytvořit obyčejný název.

Poté můžete přidat pouze potřebné identifikátory a zbytek nechat na pokoji.

Je důležité si uvědomit, že pokud se název lokální proměnné a hlavní shodují, pak v tomto případě bude první ve skrytém přístupu.

Upozorňujeme, že vytváření proměnných se stejným názvem je nezákonné.

Rada! Pro snazší použití může být direktiva using umístěna v horní části souboru formátu cpp. nebo naopak uvnitř vytvořené knihovny.

Abyste si zajistili co nejpohodlnější pracovní podmínky, můžete pracovat na umístění potřebných souborů.

Není-li to nezbytně nutné, neměla by se používat směrnice v záhlavích v souboru formátu H.

To je způsobeno skutečností, že touto akcí budou všechny identifikátory aktivní v poli viditelnosti, čímž se zvýší pravděpodobnost konfliktu některých jmen.

U souborů je nejlepším řešením použít celý název.

V případě, že se ukáže, že jsou příliš dlouhé, můžete použít zkratky ve formě aliasů.

Deklarace jmenného prostoru

Je zvykem umisťovat inzeráty ve formě názvů souborů. V případě, že se provádění zadaných funkcí nachází v samostatné knihovně nebo souboru, je důležité určit celé jméno.

Abychom pochopili, o jakých akcích mluvíme, stojí za to podívejte se na následující obrázek:

Pro implementaci funkce contosodata formátu cpp. je také důležité použít v případě celé jméno když je směrnice na samém začátku:

Použití jmenného prostoru std. může obsahovat reklamy v několika sekcích najednou umístěných ve stejném souboru.

Díky kompilátoru jsou všechny prvky během zpracování dat kombinovány.

Takže například std. je zpravidla deklarováno ve všech hlavičkách přístupných souborů umístěných v přístupných knihovnách standardního typu.

Členy označené plně kvalifikovaným jménem lze definovat nejen v rámci jmenného prostoru, ale i mimo něj, pokud mají explicitní kvalifikaci.

Pokud jde o definici, musí následovat za deklarací ve jmenném prostoru, kde je vytvořena.

Jako vizuální příklad věnujte pozornost následujícímu obrázku:

Nejčastěji se tato chyba objeví, když je porušeno pořadí definice nebo jsou součásti celého jména okamžitě zahrnuty do dostupných objektů.

Pokud soubory cookie nejsou deklarovány v konkrétním jmenném prostoru, formálně patří do prostoru globálního typu.

Rada! Pokud to není nezbytně nutné, doporučuje se vyhnout se zahrnutí členů do prostoru globálních typů.

Významnou výjimkou z pravidla může být pouze hlavní možnost, což znamená povinné začlenění do obrovského prostoru.

Chcete-li vytvořit globální identifikátor typu, musíte použít odpovídající funkci viditelnosti ve formě celého jména.

Tato akce pomůže vytvořit rozlišovací vlastnost jednoho identifikátoru od ostatních existujících, které jsou v jiném jmenném prostoru.

To vám pomůže pochopit kód.

Space std.

Stojí za zmínku, že prostory mohou být vnořeného typu.

Pokud je myšleno obyčejné zapuštění, pak má neomezený charakter do celého prostoru.

Když už jsme u rodičovských členů, ti takovou funkci nemají.

Pro rozšíření jsou nutné vestavěné nástavce.

Pro přesnější definici a pochopení věnujte pozornost následujícímu obrázku:

Zapouzdřující informace pro další implementaci může být také součástí běžného vnořeného prostoru a fungovat jako rozhraní otevřeného typu v nadřazeném prostoru.

Porovnání jsou běžné přílohy standardního typu, vestavěné členy nadřazeného jmenného prostoru.

V důsledku toho můžete použít vyhledávání funkcí, které mají nějaký druh přetížení, kde bude existovat závislost argumentů.

Chcete-li vidět příklad toho, jak se provádí vazba, Stojí za to odkázat na následující příklad:

Následující obrázek ukazuje proces specializace v šabloně nadřazeného prostoru, který je deklarován v dočasném prostoru vestavěného typu:

Využitím vestavěných prostorů je možné spravovat různé verze rozhraní ve standardních knihovnách.

Je možné vytvořit jeden, jediný nadřazený prostor a zapouzdřit každé prezentované rozhraní.

Musí však být ve formátu přílohy ve sdíleném nadřazeném prostoru.

Poté je klientský kód automaticky přiřazen k nové kombinaci.

Uživatelé, kteří jsou zvyklí používat starou verzi, ji mohou bez problémů používat i nadále.

Chcete-li to provést, musíte vytvořit úplnou cestu k příloze.

Chcete-li uspořádat první oznámení, musíte použít inline klíč.

Podívejme se na následující příklad dvou možností rozhraní, kde každá má prostor. Klientský kód má také schopnost využívat nové knihovny.

Pro vizualizaci procesu Pojďme k následujícímu obrázku:

Všechny názvy musí být extrémně jedinečné, proto se jejich délka výrazně prodlužuje.

Zde však není možné použít direktivu using.

Je možné vytvořit pouze alias pro jmenný prostor.

V tomto případě zvažte následující příklad:

Je také možné vytvořit obyčejný prostor, ale není mu přiřazen alias.

Takové územní spektrum se nazývá anonymní.

Zpravidla se používá v situacích, kdy členy v deklaraci musí být neviditelné pro kódování v jiných objektech.

Celá struktura, kdy jsou všechny identifikátory vidět, však mimo vytvořený prostor zůstanou neviditelné.

Stojí za povšimnutí, že samotný jmenný prostor bude mimo blok také neviditelný, takže každý uživatel by si měl tento detail předem povšimnout.

Obvykle je použití znalostí vyžadováno pro ty, kteří pracují ve Visual C++.

Na kvalitních příkladech bude mnohem snazší toto téma pochopit.

Řekněme, že chceme sdílet naši třídu Array vyvinutou v předchozích příkladech. Nebyli jsme však sami, kdo se s tímto problémem vypořádal; Možná někdo někde, řekněme, v jedné z divizí Intelu, vytvořil stejnojmennou třídu. Protože názvy těchto tříd jsou stejné, potenciální uživatelé nemohou používat obě třídy současně, musí si vybrat jednu z nich. Tento problém je vyřešen přidáním do názvu třídy nějakého řetězce identifikujícího její vývojáře, řekněme,

Třída Cplusplus_Primer_Third_Edition_Array ( ... );

To samozřejmě také nezaručuje jedinečnost názvu, ale s největší pravděpodobností to uživatele tohoto problému zachrání. Jak nepohodlné je však používat tak dlouhá jména!
Standard C++ nabízí mechanismus pro řešení problému shody jmen, tzv jmenný prostor. Každý výrobce softwaru může zabalit své třídy, funkce a další objekty do vlastního jmenného prostoru. Takto například vypadá deklarace naší třídy Array:

Jmenný prostor Cplusplus_Primer_3E ( šablona class Array(...); )

Klíčové slovo jmenný prostor specifikuje jmenný prostor, který definuje viditelnost naší třídy, v tomto případě nazývanou Cplusplus_Primer_3E. Řekněme, že máme třídy od jiných vývojářů umístěné v různých jmenných prostorech:

Jmenný prostor IBM_Canada_Laboratory ( šablona class Array(...);
třída Matice(...);
}
jmenný prostor Disney_Feature_Animation (
třída Bod(...);
šablona class Array(...);
}

Ve výchozím nastavení jsou v programu viditelné objekty deklarované bez explicitního jmenného prostoru; patří k globální jmenný prostor. Chcete-li odkazovat na objekt z jiného prostoru, musíte použít jeho kvalifikovaný název, který se skládá z identifikátoru jmenného prostoru a identifikátoru objektu, oddělených operátorem rozlišení rozsahu (::). Takto vypadají volání objektů ve výše uvedených příkladech:

Cplusplus_Primer_3E::Pole text; IBM_Canada_Laboratory::Matrix mat; Disney_Feature_Animation::Počátek bodu(5000,5000);

Pro snadné použití můžete jmenným prostorům přiřadit aliasy. Přezdívka je zvolena tak, aby byla krátká a snadno zapamatovatelná. Například:

// aliasy jmenný prostor LIB = IBM_Canada_Laboratory; jmenný prostor DFA = Disney_Feature_Animation;
int main()
{
LIB::Pole ia(1024);
}

Aliasy se také používají ke skrytí použití jmenných prostorů. Nahrazením aliasu můžeme změnit sadu funkcí a tříd, které se týkají, a ve všech ostatních ohledech programový kód zůstane stejný. Opravením pouze jednoho řádku ve výše uvedeném příkladu získáme definici zcela jiného pole:

Jmenný prostor LIB = Cplusplus_Primer_3E; int main() ( LIB::Array ia(1024); )

Samozřejmě, aby to bylo možné, musí existovat přesná shoda mezi rozhraními tříd a funkcemi deklarovanými v těchto jmenných prostorech. Představme si, že třída Array z Disney_Feature_Animation nemá konstruktor s jedním parametrem – velikostí. Poté následující kód vyvolá chybu:

Jmenný prostor LIB = Disney_Feature_Animation;
int main()
{
LIB::Pole ia(1024);
}

Ještě pohodlnějším způsobem je použít jednoduchý, nekvalifikovaný název k odkazování na objekty definované v nějakém jmenném prostoru. Na to existuje direktiva použití:
#include "IBM_Canada_Laboratory.h"

Použití jmenného prostoru IBM_Canada_Laboratory;
int main()
{
Matrix mat(4,4);
// IBM_Canada_Laboratory::Array
Pole ia(1024);
// ...
}

V programu se zviditelní jmenný prostor IBM_Canada_Laboratory. Můžete zviditelnit ne celý prostor, ale jednotlivá jména v něm (výběrově pomocí direktivy):

#include "IBM_Canada_Laboratory.h" pomocí jmenného prostoru IBM_Canada_Laboratory::Matrix;
// bude viditelný pouze Matrix
int main()
{
// IBM_Canada_Laboratory::Matrix
Matrix mat(4,4); // Chyba: IBM_Canada_Laboratory::Array je neviditelné
Pole ia(1024);
// ... }

Jak jsme již zmínili, všechny komponenty standardní knihovny C++ jsou deklarovány uvnitř jmenného prostoru std. K přímému použití standardních funkcí a tříd tedy nestačí pouze zahrnutí hlavičkového souboru:

#zahrnout // chyba: řetězec je neviditelný

Musíte použít direktivu using:

#zahrnout pomocí jmenného prostoru std; // Ok: viz řetězec
string current_chapter = "Recenze C++";

Všimněte si však, že se tímto způsobem vracíme k problému „zanášení“ globálního jmenného prostoru, k jehož řešení byl mechanismus pojmenovaných prostorů vytvořen. Proto je lepší použít buď kvalifikovaný název:

#zahrnout // správně: kvalifikovaný název std::string current_chapter = "Přehled C++"; nebo selektivní direktivu pomocí: #include pomocí jmenného prostoru std::string; // Ok: řetězec je viditelný
string current_chapter = "Recenze C++";

Doporučujeme použít druhou metodu.
Ve většině příkladů v této knize byly direktivy jmenného prostoru vynechány. To se provádí za účelem zmenšení velikosti kódu a také proto, že většina příkladů byla zkompilována pomocí kompilátoru, který nepodporuje jmenné prostory – nedávná inovace v C++ je dostačující. (Podrobnosti o použití deklarací při práci se standardní knihovnou C++ jsou popsány v části 8.6.)
V následujících kapitolách vytvoříme další čtyři třídy: String, Stack, List a modifikaci Stack. Všechny budou uzavřeny v jednom jmenném prostoru - Cplusplus_Primer_3E. (Práci se jmennými prostory se podrobněji věnujeme v kapitole 8.)

Cvičení 2.21

Daný jmenný prostor

Cvičení jmenného prostoru ( šablona class Array(...);
šablona
neplatný tisk (Array< EType >);
třída Řetězec ( ... )
šablona
třída Seznam(...);
}

a text programu:

Int main() ( const int size = 1024; Array soudní zasedání); Seznam il(velikost);
// ...
Pole *pas = nové pole (tak jako);
Seznam *pil = nový seznam (il);
print(*pas);
}

Program se nezkompiluje, protože deklarace použitých tříd jsou uzavřeny ve jmenném prostoru cvičení. Upravte kód programu pomocí
a) kvalifikovaná jména
b) selektivní použití směrnice
c) mechanismus přezdívek
d) pomocí směrnice

Anotace: Tato část popisuje použití a deklaraci jmenných prostorů. Jsou uvedeny hlavní charakteristiky RDF, XML-Data, Document Content Description (DCD), Schéma pro objektově orientované XML (SOX), Document Definition Markup Language (DDML, dříve známý jako XSchema).

Dříve jsme popsali některé nevýhody definic DTD, které souvisí:

  1. syntaxe těchto definic se liší od syntaxe XML (konkrétně tzv. rozšířené Backus-Naur forma, Rozšířený formulář Backus Naur);
  2. tyto definice nejsou dostatečně expresivní;
  3. Vzhledem k tomu, že každý uživatel může vytvářet své vlastní značky, je docela pravděpodobné, že lidé budou používat stejné názvy prvků k odkazování na různé věci. I když jsou významy prvků stejné, jejich možný obsah se může lišit v závislosti na definici. Potřebujeme tedy způsob, jak definovat konkrétní použití prvku, zvláště pokud ve stejném dokumentu mícháme různé druhy slovníků. K vyřešení tohoto problému vydala W3C specifikaci nazvanou XML Namespaces, která umožňuje definovat kontext prvku ve jmenném prostoru.
  4. Existují situace, kdy je nutné kombinovat XML dokumenty z různých zdrojů odpovídající různým definicím DTD. Tato situace nastává například při popisu velkého objemu informací, pokud jednotlivé DTD nestačí pokrýt celý objem nebo jsou obtížně srozumitelné. Vyskytuje se také v systémech elektronického obchodování, když se snažíte spojit data vašeho obchodního partnera s vašimi. Může také nastat situace, kdy jednoduše potřebujete přidat svá nastavení do existujícího DTD za účelem výměny některých informací ve standardním formátu. Doporučení XML bohužel neposkytuje způsob, jak zkombinovat více DTD v jednom dokumentu, aniž byste je upravili nebo vytvořili nové DTD (pomocí externích referencí).

Tato kapitola pokrývá následující dva pojmy - jmenný prostor a schémata XML. Jmenné prostory umožňují vývojářům XML rozdělit složitý problém na malé kousky a zkombinovat více slovníků do jednoho dokumentu, aby jej plně popsali. Pomocí schémat vytvářejí návrháři slovníků přesnější definice, než bylo možné v DTD, a to pomocí syntaxe XML.

Tyto dva nástroje pomáhají řešit složité problémy, které vznikají při používání XML. Jmenné prostory a schémata umožňují návrhářům a programátorům XML:

  • lépe organizovat slovní zásobu pro řešení složitých problémů;
  • Držet silné psaní data během transformací do az XML;
  • Popište slovní zásoby přesněji a flexibilněji, než to bylo možné u DTD;
  • Čtěte pravidla slovníku v XML a přistupujte k jeho definicím bez komplikování analyzátoru.

Míchání slovníků

Při navrhování slovníku může mít smysl rozdělit globální problém do několika částí. To vyžaduje způsoby, jak rozdělit velký problém do více slovníků. Skutečným problémem, který je třeba vyřešit, je však sloučení samostatných DTD v těle jednoho dokumentu. Tento problém může nastat i v případě, že například pracujete pro korporaci, ve které s největší pravděpodobností již soubor definic DTD existuje a jejich použití může značně usnadnit práci, protože popisují problém tak, jak jej chápou ostatní. Často je také užitečné znovu použít definice DTD, tzn. Použití běžných konstrukcí z dříve vytvořených definic DTD. Pokud vyvíjíte aplikaci, která potřebuje komunikovat se softwarem externího partnera, nemáte jinou možnost, než znovu použít stávající koncepty. Stávající definice DTD představují společný jazyk, kterým se musí mluvit, aby mu bylo rozumět. Jestliže koncept již existuje, je třeba pracovat na tom, aby byl chápán v termínech tohoto konceptu.

Když použijete definice, které jsou pro vás užitečné z DTD jiných vývojářů, nebo když zkombinujete segmentované DTD k vytvoření dokumentu, který popisuje složitý problém, pokud vaše dokumenty používají prvky se stejnými názvy, riskujete, že narazíte na problémy nejednoznačnost a kolize jmen.

Problém se dále zhoršuje při použití instancí jmen z více DTD. V tomto případě nevíme, na který prvek, který definice DTD odkazuje, se tento problém dobře zpracovaných dokumentů nazývá nejednoznačnost. Navíc, pokud to jména z dokumentu vyžadují kontroly platnosti, můžeme udělat naši aplikaci velmi matoucí. Tento problém se nazývá kolize jmen.

Jmenné prostory

Jmenné prostory mohou uživateli pomoci dvěma velmi důležitými způsoby. S jejich pomocí můžete:

  • kombinovat dokumenty ze dvou nebo více zdrojů bez ztráty jistoty, že program rozliší, ze kterého zdroje je prvek nebo atribut převzat;
  • Pokud je to možné, povolte uživatelskému agentovi přístup k dalším materiálům, jako je definice typu dokumentu (DTD) nebo jiný popis prvků a atributů.

Jmenný prostor je sbírka určitých hodnot nebo charakteristik, které lze použít v dokumentech XML jako názvy prvků nebo atributů. Jmenné prostory v XML jsou definovány pomocí identifikátoru URI (Uniform Resource Identifier) ​​(jako URI můžete použít adresu DTD na vašem serveru). Umožňuje, aby byl každý jmenný prostor jedinečný.

Abychom tedy mohli efektivně používat jmenné prostory v dokumentu, který kombinuje prvky z různých zdrojů, musíme definovat:

  • Odkaz na URI, který popisuje použití prvku.
  • Alias, který nám umožňuje pochopit, ze kterého jmenného prostoru náš prvek pochází. Tento alias je ve formě předpony prvku (pokud je například alias pro neznámý prvek Book Catalog , pak by se prvek nazýval ).

Používání a deklarování jmenných prostorů

Deklarace jmenného prostoru

Vzhledem k tomu, že v různých značkovacích jazycích - implementacích XML - lze nalézt stejné názvy značek a jejich atributů, které mají zcela odlišný význam, je nutné je umět nějak rozlišovat. Za tímto účelem jsou názvy značek a atributů opatřeny krátkou předponou, která je od názvu oddělena dvojtečkou. Předpona názvu je spojena s identifikátorem, který definuje jmenný prostor. Všechny názvy značek a atributů, jejichž předpony jsou spojeny se stejným identifikátorem, tvoří jeden jmenný prostor, ve kterém musí být názvy jedinečné.

Protože chceme, aby každý byl schopen rozpoznat deklaraci jmenného prostoru, když ji vidíme, vyhrazujeme si pro ni speciální slovo. Podle doporučení jmenných prostorů je slovo xmlns . Hodnota atributu je URI, která určuje jmenný prostor, který se má použít. Toto je často adresa URL definice DTD, ale nemusí to tak být vždy. Předpona a identifikátor jmenného prostoru jsou definovány atributem xmlns takto:

Jak vidíte, předpona ntb byla právě definována, ale již lze použít v názvu ntb: notebook . V budoucnu budou názvy značek a atributů, které chceme přiřadit jmennému prostoru http://some.firm.com/2003/ntbml, opatřeny předponou ntb, například:

Gorelovo

Kromě toho se v jedné značce může vyskytovat několik jmenných prostorů. Níže je uveden příklad smíchání více jmenných prostorů:

Prvek kniha pochází z jmenného prostoru katalogu a atribut ISBN pochází z objednávky .

Například jméno spolu s předponou

nazývaný rozšířený, kvalifikovaný nebo kvalifikovaný název (OName. Qualified Name). Část jména napsaná za dvojtečkou se nazývá místní část jména.

Nomenklatura názvů webových zdrojů může být matoucí. Uniform Resource Locator ( Uniform Resource Locator, URL) označuje zdroj z hlediska přístupového protokolu a umístění v síti. Jednotný identifikátor zdroje ( Uniform Resource Identifier, URI) je jedinečný název pro nějaký zdroj. Podívejte se na URI jednoduše jako na jedinečný řetězec znaků, který identifikuje jmenný prostor.

Podle pravidel SGML a XML lze ve jménech použít dvojtečku jako běžný znak, takže jméno s předponou je jen trik; každý program, který „nezná“ jmenný prostor, analyzuje dokument, kvalifikované jméno jako běžné jméno. Z toho zejména vyplývá, že v deklarace typu dokumentu Předpony jmen (deklarace typu dokumentu) nelze vynechat.

Atribut xmlns se může objevit v libovolném prvku XML, nejen v kořenovém prvku. Prefix, který definuje, lze použít v prvku, ve kterém je zapsán atribut xmlns, a ve všech prvcích v něm vnořených. Navíc lze v jednom prvku definovat více jmenných prostorů.

Ve vnořených prvcích lze jmenný prostor přepsat přiřazením předpony k jinému identifikátoru.

Vzhled názvu značky bez předpony v dokumentu, který používá jmenný prostor, znamená, že název patří do výchozího jmenného prostoru.

Dobře navržený dokument by měl používat jmenné prostory pro všechny své prvky.

Předpony začínající znaky xml jsou v každém případě vyhrazeny pro samotný jazyk XML. Předpona xmlns se používá k přidružení jiné definované předpony k jejímu identifikátoru jmenného prostoru. Předpona xmlns nemusí být definována, je zavedena doporučením „Namespaces in XML“ a je tam spojena s identifikátorem jmenného prostoru. http://www.w3.ori/2000 /xmlns/.

Další předpona, xml, je spojena se stejným doporučením s identifikátorem http://www.w3.org/XML/1998/namespace. Také nemusí být definován v dokumentu XML. K těmto identifikátorům nelze přidružit žádnou další předponu. Instrukce zachovat, aby zůstaly prázdné znaky nedotčené. To je důležité pro některé texty, jako jsou programové kódy. Výchozí hodnota ponechává prázdné znaky na uvážení obsluhy.

Rozsah

Deklarace jmenného prostoru mají rozsah, stejně jako deklarace proměnných v programovacích jazycích. To je důležité, protože jmenné prostory nejsou vždy deklarovány na začátku dokumentu XML; někdy jsou deklarovány v následujících sekcích. Deklarace jmenného prostoru se vztahuje na prvek, ve kterém se vyskytuje, stejně jako na potomky tohoto prvku, i když tam není explicitně definován. Název může odkazovat na jmenný prostor, pouze pokud je použit v rozsahu jeho deklarace.

Budeme však také muset kombinovat obory jmenných prostorů na prvcích, které by jinak zdědily jiné jmenné prostory. V tomto ohledu jsou definovány dva způsoby deklarace rozsahu: výchozí a kvalifikovaný.

Výchozí rozsah

Jak můžete očekávat, nutnost přidávat před každé jméno v dokumentu se rychle stává únavným. Ve skutečnosti zavedením konceptu rozsahu názvu můžeme v našem dokumentu smíchat velké množství předpon. Pokud definujeme výchozí jmenný prostor, předpokládá se, že vlastní všechna nekvalifikovaná jména v rozsahu jeho deklarace. Výchozí jmenný prostor deklarovaný v kořenovém prvku je tedy považován za výchozí pro celý dokument a může být přepsán pouze konkrétnějším jmenným prostorem deklarovaným v dokumentu.

Chcete-li, aby se jmenný prostor stal výchozím jmenným prostorem pro obor, jednoduše vynechejte deklaraci předpony.

Pokud je předpona deklarována a poté použita ve spojení s názvem, říká se, že jmenný prostor je explicitně stanoven. Chcete-li k oboru názvů přiřadit nekvalifikovaný název, musíte deklarovat výchozí prostor, který obsahuje nekvalifikovaný název (bez předpony).

Kvalifikovaný rozsah

Výše uvedená metoda funguje dobře, pokud můžete jasně oddělit své jmenné prostory. Někdy je ale nutné do dokumentu zahrnout jednotlivá jména z externích jmenných prostorů. Místo deklarování jmenných prostorů pro celý obor můžete použít kvalifikované názvy. Na začátku dokumentu deklarujte jmenné prostory, které potřebujete, a poté je kvalifikujte v okamžiku použití.

Pomůže.
Cesta k podpoře jmenného prostoru v PHP byla skalnatá. Ale naštěstí byl přidán do jazyka v PHP 5.3 a struktura PHP kódu se od té doby výrazně zlepšila. Ale jak přesně bychom je měli používat?

Co jsou jmenné prostory?

"Nezapomeňte na zpětné lomítko, když ukládáte název jmenného prostoru jako řetězec!"

Představte si jmenný prostor jako krabici, do které můžete vložit cokoli: tužku, pravítko, kus papíru a tak dále. To jsou tvoje věci. Přímo pod vaší krabicí je krabice někoho jiného a její majitel v ní uchovává stejné věci. Abyste se vyhnuli vzájemnému používání věcí, rozhodnete se krabice označit tak, aby bylo jasné, co komu patří.

Dříve museli vývojáři k oddělení kódu používat ve svých třídách, funkcích a konstantách předpony podtržení. To je ekvivalentní tomu, že si každý označí své věci a uloží je do jedné velké krabice. Samozřejmě je to alespoň nějaká organizace, ale je velmi neefektivní.

Jmenné prostory, pomoc! Můžete deklarovat stejnou funkci, třídu, rozhraní a definovat konstantu v samostatných jmenných prostorech, aniž by došlo k fatálním chybám. V jádru jmenné prostory nejsou nic jiného než hierarchicky označené bloky kódu obsahující běžný PHP kód.

Ty je používáš!

Je důležité pochopit, že používáte jmenné prostory nepřímo; Od PHP 5.3 spadají všechny definice, které ještě nejsou deklarovány v uživatelsky definovaných jmenných prostorech, pod globální jmenný prostor.

Globální jmenný prostor také ukládá všechny interní definice PHP, jako je mysqli_connect() a třída Exception. Protože globální jmenný prostor nemá jedinečný identifikační název, nejčastěji se nazývá globální jmenný prostor.

Vezměte prosím na vědomí, že použití jmenného prostoru je volitelné.
Váš PHP skript bude fungovat dobře i bez nich a toto chování se příliš brzy nezmění.

Definice jmenného prostoru

Soubor obsahující jmenný prostor musí obsahovat jeho deklaraci na začátku před jakýmkoli jiným kódem. Jediná věc, která může být deklarována před jmenným prostorem, je vyhrazené slovo deklarovat , deklarační výraz se může objevit před deklarací jmenného prostoru, aby označoval kódování souboru.

Jmenné prostory jsou deklarovány pomocí vyhrazeného slovního jmenného prostoru. Jmenné prostory se řídí stejnými pravidly jako ostatní identifikátory v PHP. Takže jmenný prostor by měl začínají písmenem nebo podtržítkem následovaným libovolným počtem písmen, číslic nebo podtržítek.

Pokud chcete definovat blok kódu do globálního prostoru, můžete použít klíčové slovo jmenný prostor bez přidání názvu.

V jednom souboru můžete použít více jmenných prostorů.

Můžete také použít stejný jmenný prostor pro několik různých souborů; proces připojení souborů je automaticky sloučí. Je dobrou praxí kódování omezit počet definic jmenného prostoru na jeden soubor, stejně jako byste to mohli udělat s třídami.

Jmenné prostory se používají, aby se zabránilo nekonzistentním definicím a zavedly do programového kódu větší flexibilitu a organizaci.

Vezměte prosím na vědomí, že složené závorky jsou zcela volitelné. Ve skutečnosti použití pravidla jednoho jmenného prostoru na soubor a vynechání složených závorek dělá váš kód mnohem čistším – není potřeba odsazovat vnořený kód.

Podjmenné prostory

Jmenné prostory mohou sledovat určitou hierarchii, stejně jako adresáře v systému souborů v počítači. Subnamespaces jsou extrémně užitečné pro organizaci struktury projektu. Pokud váš projekt například vyžaduje přístup k databázi, můžete umístit obslužnou rutinu výjimek databáze a kód obslužné rutiny připojení do podjmenného prostoru databáze.

Pro flexibilitu je rozumné ukládat vnořené jmenné prostory do podadresářů. To pomáhá strukturovat projekt a usnadňuje jeho použití pro automatické nakladače, které dodržují standard PSR-4.

PHP používá zpětné lomítko jako oddělovač jmenného prostoru.

Zajímavost: v RFC se při rozhodování, který oddělovač jmenného prostoru použít, zvažovala možnost použití emotikonu.

// myproject/database/connection.phpMůžete použít tolik vnořených jmenných prostorů, kolik chcete.

Definování podnázvového prostoru pomocí vnořených bloků kódu není podporováno. Následující příklad vrátí závažnou chybu: "Deklarace oboru názvů nelze vnořit."

Volání kódu z jmenného prostoru

Pokud chcete vytvořit novou instanci objektu, zavolat funkci nebo použít konstanty z různých jmenných prostorů, použijete zpětné lomítko. Existují tři typy definic jmenného prostoru:
  • Nekvalifikované jméno
  • Kvalifikovaný název
  • Plně kvalifikovaný název

Neúplný název

Toto je název třídy, funkce nebo konstanty a neobsahuje odkaz na žádný jmenný prostor. Pro ty, kteří teprve začínají pracovat s jmennými prostory, je to běžný úhel pohledu.

Celé jméno

Takto přistupujeme k hierarchii podjmenného prostoru; oddělené zpětným lomítkem.

Níže uvedený příklad vrátí závažnou chybu: „Závažná chyba: Třída „MyProject\Database\MyProject\FileAccess\Input“ nebyla nalezena“, protože MyProject\FileAccess\Input není relevantní pro jmenný prostor, ve kterém se nacházíte.

Absolutní jméno

Úplné a částečné názvy se používají ve vztahu k jmennému prostoru, ve kterém se právě nacházíte. Lze je použít pouze k definování přístupu na této úrovni nebo k ponoření se hlouběji do hierarchie jmenného prostoru.

Pokud chcete přistupovat k funkci, třídě nebo konstantě, která je na vyšší úrovni hierarchie, musíte použít celé jméno – absolutní cestu, nikoli relativní. Volání musí začínat zpětným lomítkem. To dává PHP vědět, že toto volání by mělo být provedeno z globálního prostoru, spíše než k němu přistupovat vzhledem k vaší aktuální poloze.

Pro interní funkce PHP nemusíme používat celý název. Nekvalifikované názvy funkcí a konstant budou definovány v globálním jmenném prostoru, pokud nejsou definovány v aktuálním jmenném prostoru.

Když to víme, můžeme nyní přetížit interní funkce PHP a přitom stále být schopni volat původní funkci (nebo konstantu).

"; }

Dynamické hovory

PHP je dynamický programovací jazyk; takže tuto funkci můžete použít k volání kódu z oboru názvů. To je v podstatě stejné jako použití názvu dynamické třídy nebo připojení dynamického souboru pomocí proměnné k uložení jeho názvu. Oddělovač jmen PHP používá stejné metaznaky v řetězcích. Při ukládání názvu jmenného prostoru jako řetězce nezapomeňte na zpětné lomítko!

klíčové slovo jmenného prostoru

Klíčové slovo jmenný prostor se nepoužívá pouze k definování jmenného prostoru, lze jej také použít k volání aktuálního jmenného prostoru, funkčně podobné klíčovému slovu self pro třídy.

__NAMESPACE__ konstanta

Stejně jako klíčové slovo self nelze použít k definování názvu aktuální třídy, nelze klíčové slovo jmenného prostoru použít pro aktuální jmenný prostor. Proto používáme konstantu __NAMESPACE__

Tato konstanta je docela užitečná, když se začínáte učit jmenný prostor; je také velmi užitečný pro ladění. Protože se jedná o řetězec, lze jej použít ve spojení s voláním dynamického kódu popsaným výše.

Importujte nebo vytvořte alias názvu

není nutné používat ve jmenných prostorech

Důležitou vlastností jmenných prostorů v PHP je schopnost odkazovat na externí absolutní jméno pomocí pseudonym nebo importu.

Importy jsou velmi užitečným a základním aspektem jmenných prostorů. To vám dává možnost používat externí balíčky, jako jsou knihovny, bez obav z konfliktů názvů. Import se provádí pomocí klíčového slova use. V případě potřeby můžete zadat vlastní alias pomocí klíčového slova as.

Použít jako

Jak to použít

Absolutní název může být spojen s kratším nekvalifikovaným názvem, takže nemusíte psát jeho absolutní název pokaždé, když jej chcete použít. K vytvoření nebo importu aliasu musí dojít v nadřazeném jmenném prostoru nebo globálním. Pokus o to v rámci metody nebo funkce je neplatná syntaxe.

Alternativou je přiřazení aliasu s jiným názvem

Můžete také importovat globální třídy, jako je Exception. Při importu nemusíte psát jeho absolutní název.

Všimněte si, že u jmen ve jmenném prostoru není úvodní zpětné lomítko nutné a jeho přítomnost v něm se nedoporučuje, protože importovaná jména musí být absolutní a nejsou analyzována vzhledem k aktuálnímu jmennému prostoru.

Přestože existuje podpora pro vyvolání dynamického jmenného prostoru, dynamický import není podporován.

Závěr

Jmenné prostory se používají k zamezení konfliktu definic a zavedení větší flexibility a organizace do programového kódu. Pamatujte, že nemusíte používat jmenné prostory; Tato funkce se používá v kombinaci s objektově orientovaným přístupem. Doufám, že zvážíte, že svůj (budoucí) projekt PHP posunete na další úroveň pomocí jmenných prostorů.