PHP 5.3 krok za krokem - Namespace

Patrik Votoček

Jsou tomu už skoro dva měsíce, co vyšla první stabilní verze PHP 5.3. A tak se pojďme podívat, co z praktického hlediska přináší za novinky.

To je asi ta nejzásadnější novinka. Už v dobách kdy přišlo PHP s lepší podporou objektů (verze 5.0), vylezla na povrch otázka, jak řešit případné kolize v názvech tříd u jednoho projektu. Modernější jazyky, jako je C#, Java a podobně, to řeší pomocí jmenných prostorů (namespace). Jenomže PHP nic takového nemělo a tak spousta dnešních knihoven existuje i v tak zvané “prefixed” verzi/sestavení, která tento problém řeší tak trochu oklikou. Prostě a jednoduše vezme všechny třídy definované knihovnou a na začátek názvu přidá “prefix”, jako to známe třeba u tabulek databáze. Někde to řeší přidáním prvního písmenka z názvu knihovny, jinde zase přidáním celého názvu knihovny a podtržítka. Je to rychlé a funkční řešení, ale není to ono a tak tu jsou jmené prostory. Jmenné prostory jsou v podstatě “obaly” kolem tříd. Představte si třídu, jako sušenku a jmenný prostor jako její obal. Obalů může být i více a tak naši sušenku dáme do krabice k ostatním. Krabice je další obal a teď můžeme krabici vzít a dát na paletu a máme další obal a tak dále a tak dále.

Odbočka

Původně měly být jmenné prostory až v PHP 6, ale nakonec byly přesunuty už do PHP 5.3.

Jak to teda funguje? Vezměme si příklad z reálného života v Nette existuje třída HttpRequest a ta může kolidovat s HTTP rozšíření samotného PHP. Proto je tu prefixed verze pro PHP verze starší než 5.3. A jak tento problém řešit pomocí jmenných prostorů? Jednoduše před definici třídy napíšeme namespace Nette; a tím třídu “zabalíme”. Nyní k třídě nemůžeme přistupovat jednoduše zavoláním HttpRequest, ale musíme používat i jmenný prostor. K třídě tedy musíme přistupovat takto \Nette\HttpRequest. Všimněte si zpětného lomítka, které za bouřlivé diskuse bylo nakonec zvoleno jako oddělovač právě pro jmenné prostory. Pozornější si všimli, že před jmenným prostorem je také lomítko, ale tady neslouží tak úplně jako oddělovač jmenných prostorů, ale spíše jako “resetovač”. Řekne totiž kompileru, že má jmenný prostor Nette hledat na “nulté” úrovni. Pokud by vás nebavilo používat všude takto dlouhý zápis, můžete použít na začátku souboru magické slovíčko use a konstrukci use \Nette\HttpRequest;. Nyní můžete používat třídu klasicky bez uvádění jmenného prostoru. Jak už jsem psal výše, tak jmenné prostory mohou být libovolně zanořené a tak můžete definovat jmenný prostor klidně i takto namespace First\Second\....\Last;.

To je pro dnešek všechno, příště si povíme o anonymních funkcích / closure.

« »