Príklady použitia menného priestoru v php. Menné priestory v PHP, vysvetlené. Globálny menný priestor


  • Preklad
  • Návod
Poznámka per.: Som si vedomý toho, že v čase prekladu je aktuálna verzia PHP 5.5 a tiež, že existuje múdra príručka. Ale zaujalo ma, ako autor prezentuje funkcionalitu namespace Snáď článok pomôže niektorým z tých, ktorí sa len učia základy (a nielen iným, je veľa bradatých vývojárov, ktorí sa usadili na PHP 5.2). Hodor.

V PHP sa od verzie 5.3 objavili menné priestory. Väčšina moderných jazykov má túto funkciu už dlho, ale PHP sa trochu oneskorilo. Každá nová funkcia má však svoj účel, poďme zistiť, aký úžitok môžeme využiť pomocou menného priestoru.

V PHP nemôžete mať dve triedy pomenované rovnako, všetky musia byť jedinečné. Problém s týmto obmedzením je v tom, že ak používate knižnicu tretej strany niekoho iného, ​​ktorá poskytuje triedu s názvom User , nemôžete si vytvoriť vlastnú triedu s názvom User . To je naozaj zlé, pretože User je veľmi vhodný názov pre triedu, však?

Menné priestory nám umožňujú obísť tento problém a môžeme vytvoriť toľko tried používateľov, koľko potrebujeme.

Poďme sa pozrieť na veľmi bežnú triedu. Áno... Viem, že ste ich už použili, čo s tým majú spoločné menné priestory? Len mi v tomto ver, dobre?

Globálny menný priestor

Tu je veľmi jednoduchá trieda:
Nič zvláštne, ako vidíte, a ak to chcete použiť, urobte toto:
Dale, trochu ovládam PHP...

Dobre, dobre, prepáč. Ide o to, že o tejto triede môžeme uvažovať ako o globálnom mennom priestore. Nie som si celkom istý, či je to správny výraz, ale znie mi to celkom primerane. V skutočnosti to znamená, že trieda nepatrí do žiadneho balíka, je to len obyčajná trieda.

Jednoduché používanie menných priestorov

Vytvorme ďalšieho Eddarda, vedľa globálneho.
Tu máme veľmi podobnú triedu s jednou malou zmenou, pridaním direktívy menného priestoru. Menný priestor reťazca Stark; hovorí PHP, že pracujeme v mennom priestore Stark a akýkoľvek kód (deklarujúci triedy, funkcie, premenné atď.) bude naň odkazovať.

Takže musíme vytvoriť nový Edd, ak sa rozhodnete, že to treba urobiť takto:
Takže nie, to nie je pravda. Tu získame inštanciu triedy z prvého príkladu, ktorý sme vytvorili predtým. Nie ten v mennom priestore Stark. Skúsme vytvoriť inštanciu Eddarda Starka.
Aby sme vytvorili inštanciu triedy, musíme pred názov triedy pridať predponu z menného priestoru, do ktorého trieda patrí, a použiť ju ako oddeľovač spätné lomítko. Výsledkom je, že máme inštanciu presne tej triedy, ktorú potrebujeme. Nie je to čarovné?

Mimochodom, menné priestory môžu tvoriť ľubovoľne zložitú hierarchiu, využívajúcu toľko úrovní, koľko je potrebné. Napríklad:
Toto\Namespace\And\Class\Combination\Is\Silly\But\Works

Teória relativity

Pamätajte si, ako som vám povedal, že PHP vždy funguje vo vzťahu k aktuálnemu mennému priestoru. Pozrime sa na to v akcii:
Pridaním direktívy menného priestoru dávame PHP vedieť, že sa nachádzame v mennom priestore Stark. Keďže práve v nej sme definovali triedu Eddard, dostaneme presne toto. Vidíte, všetko je relatívne.

Teraz, keď sme menný priestor zmenili, máme jeden malý problém. Máte predstavu o čom hovorím? Ako teraz získame našu pôvodnú Eddardovu triedu? No, ten v globálnom priestore?

Našťastie má PHP trik, ktorý nám umožňuje tento problém vyriešiť – jednoducho pridaním \ k názvu triedy.
Pri pohľade na úvodnú lomku PHP chápe, že sa musíme pozrieť za aktuálny priestor názvov a vytvorí inštanciu triedy, ktorú potrebujeme.

Teraz použite svoju predstavivosť. Predstavte si, že máme triedu z iného menného priestoru s názvom Tully\Edmure. Teraz ho musíme použiť v Starkovom priestore. A ako to urobíme?

Pred vytvorením inštancie triedy v priestore Tully sme opäť museli použiť opačnú lomku, aby sme sa dostali globálne.

Vo všeobecnosti môže byť odkazovanie na triedy z iných menných priestorov, ako je tento, s použitím úplnej hierarchie v názve, dosť únavné. Ale našťastie existuje možnosť urobiť skratku, poďme sa pozrieť:

Pomocou príkazu use môžeme získať triedu z iného menného priestoru. Len sa ma prosím nepýtajte „prečo sme sem nedali úvodnú lomku, pretože to jednoducho neviem?“ Pokiaľ viem, je to jediná výnimka. Nie, tu môžete použiť lomku. ale v tomto nebude zmysel.

Ach, ešte jeden malý trik! Našim importovaným triedam môžeme dať prezývky:
Pomocou kľúčového slova as sme triede Tully/Brynden dali prezývku Blackfish, čo nám umožňuje použiť novú prezývku na jej identifikáciu v aktuálnom priestore názvov. Šikovné, však? To je tiež veľmi výhodné, ak potrebujete použiť dve triedy s rovnakým názvom v rovnakom priestore názvov:

Tým, že Daenerys z Dothrakského priestoru dáme prezývku Khaleesi, môžeme použiť obe triedy Daenerys. Celkom pohodlné, tam môžeme použiť všetky potrebné triedy v našej aplikácii.

Štruktúra

Priestory názvov nám tiež môžu pomôcť usporiadať náš kód. Dovoľte mi demonštrovať.

Povedzme, že chcem vytvoriť knižnicu s otvoreným zdrojovým kódom. Bol by som rád, keby môj kód mohli používať aj ostatní, bolo by to skvelé! Problém je v tom, že názvy tried v mojom kóde boli v konflikte s vlastnou aplikáciou používateľa v mojej knižnici. Bolo by to strašne nepohodlné. Takto by som vyriešil tento problém:
Dayle\Blog\Content\Post Dayle\Blog\Content\Stránka Dayle\Blog\Tag
Tu som použil svoje meno, aby som ukázal, že kód patrí mne, a oddelil som svoj kód od používateľského kódu mojej knižnice. V rámci základného menného priestoru som vytvoril štruktúru tried podľa ich hierarchie.

Keď začnete používať skladateľ, naučíte sa používať menné priestory na uľahčenie automatického načítania kódu. Dôrazne vám odporúčam, aby ste sa pozreli na tento užitočný mechanizmus.

Nedostatky

Aby som povedal pravdu, cítim sa trochu previnilo, keď som tento podtitul nazval „Nevýhody“. To, o čom budem hovoriť, v skutočnosti nie je chyba.

Faktom je, že v iných jazykoch je funkčnosť menných priestorov implementovaná podobným spôsobom a jazyky zároveň poskytujú ďalšie funkcie na interakciu s mennými priestormi.

V jazyku Java môžete napríklad importovať viacero tried do aktuálneho priestoru názvov pomocou príkazu import. V Jave je import analogický ako použitie a používa bodky na oddelenie vnorených menných priestorov (alebo balíkov). Tu je príklad:
import dayle.blog.*;
Týmto sa importujú všetky triedy v balíku „dayle.blog“.

V PHP to nemôžete urobiť. Každú triedu musíte importovať samostatne. Prepáč. Vlastne, prečo sa ospravedlňujem? Pokračujte a sťažujte sa vývojovému tímu PHP, ale prosím vás, aby ste boli zdvorilí. V poslednom čase urobili veľa zaujímavých vecí.

Tu je úhľadný trik, ako problém trochu zmierniť. Predstavte si, že máme štruktúru tried z predchádzajúceho príkladu. Môžeme vziať časť podpriestoru a dať mu alias.
To môže byť užitočné pri použití veľkého počtu tried. Dobré pre všetkých!

Všetky priania a návrhy rád príjmem do osobnej správy, ďakujem.

Premenná definuje hodnotu, ale môže byť odkazom na inú premennú a mať svoju hodnotu. Počas vykonávania algoritmu premenná zvyčajne nadobúda mnoho rôznych hodnôt. Konštanta ukladá iba jednu hodnotu. Objekt je nepredvídateľný: má tendenciu mať štruktúru, obsah a mnoho funkcií.

Menný priestor je kolekcia premenných, konštánt, objektov, funkcií a iných konštrukcií vytvorených vývojárom, na ktoré možno odkazovať prostredníctvom názvu tohto menného priestoru.

Názvy: oblasť popisu údajov a algoritmov

Názvy prvkov (premenné, konštanty, objekty, funkcie a iné vývojové konštrukcie) sa nikdy nepretínajú. PHP interpretuje akúkoľvek zhodu mien ako vážnu chybu a v prípadoch, keď nedokáže jasne identifikovať problém, vývojár dostane kód, ktorý nefunguje tak, ako má, alebo biele políčko v prehliadači.

Všetky názvy všetkých údajov musia byť jedinečné, pretože priestor je globálny. Názvy objektov a funkcií by sa tiež nemali opakovať, ale rozsah globálnej viditeľnosti je prerušený v telách metód objektov a funkcií. Má svoj vlastný lokálny menný priestor a nič vám nebráni pomenovať niečo interne tak, ako je to určené externe.

Vyššie uvedený príklad je klasický, ak nevenujete pozornosť kľúčovému slovu menného priestoru: všetko je ako vždy. Druhá zahŕňa diela. Predpona NameSpaceTwo\ pred názvami funkcií určuje, z ktorej vložky je kód prevzatý.

Ak odstránime globálne kľúčové slovo a operáciu z prvej funkcie $iExt = 1; prejdite na riadok vyššie, potom ani prvá ani druhá funkcia nebude vedieť o hodnote premennej 100.

Menné priestory: Viacnásobné rozsahy popisu

Zobrazený príklad má zdieľaný súbor, ktorý používa dva vložky. Každá vložka má rovnakú funkciu scCheckName(). Ktorý z nich si vybrať, rozhoduje programátor pomocou názvu priestoru, ktorý je relevantný v správnom čase na správnom mieste v kóde.

Skutočnosť, že rovnaký názov je prítomný v spoločnom kóde (po zlúčení vložiek), nespôsobuje chybu z jednoduchého dôvodu, že každý vkladací súbor je označený vlastným jedinečným názvom.

V prvom súbore je všetko, čo v ňom bude popísané, spojené s názvom NameSpaceOne. V druhom súbore budú všetky popisy spojené s názvom NameSpaceTwo.

Akékoľvek duplikovanie mien v oboch súboroch je povolené, ale v každom z nich musí byť akýkoľvek názov prvku (premenná, konštanta, objekt, funkcia) jedinečný.

V tomto príklade zmena názvu priestoru názvov vo volaní funkcie scCheckName() zabránila zmene premennej $iExt druhého priestoru názvov. Preto je v príklade slovo „zmenené“ špeciálne zvýraznené – zmena v skutočnosti neprebehla. Hodnota premennej zostáva rovnaká.

Testovanie a viacnásobný dizajn

Tieto jednoduché príklady ukazujú, že môžete jednoducho zjednodušiť vývoj zložitých projektov, zvýšiť efektivitu, produktivitu a urýchliť prácu. Rozhodne sa okamžite objavili prvé nápady na používanie menných priestorov:

  • bezpečné testovanie skriptov - nahradením „pracovných“ priestorov testovacími analógmi;
  • bezpečný dizajn od veľkých tímov vývojárov – poskytnutím „individuálnych“ priestorov na popis prvkov.

V skutočnosti je menný priestor oveľa dôležitejší. Jazyk PHP, menný priestor a každý prvok popisu (premenná, konštanta, objekt...) už dlho poskytuje vývojárom možnosť samostatne manipulovať so syntaxou a sémantikou.

Jazykové konštrukcie a všeobecné pravidlo moderného programovania: „pochopený“ – vykonaný – existuje rozpor – „biela obrazovka“ nemá na profesionálneho vývojára žiadny vplyv.

Mnoho programátorov ani nevie, kde hľadať chybové hlásenie PHP, keď v prehliadači nič nie je (prázdne biele pole). V určitom štádiu svojho vývoja programátor uvažuje v syntaxi a sémantike PHP, „pracuje“ automaticky a výsledok: jeho vlastná syntax a vlastná sémantika, v medziach toho, čo je povolené.

Biela obrazovka je okamžitá jednoznačná reakcia profesionálneho programátora a chyba je odstránená. Prečo strácať čas ladiacim programom a prezeraním denníka chýb?

Objekty, polia a priestory názvov

Dalo by sa povedať, že premenné, konštanty a funkcie sú minulosťou, no používajú sa v objektovom dizajne. Dobrý kód je, keď je algoritmus reprezentovaný interakčnými objektmi a nie sekvenciou správnych konštruktov.

Ak používate polia objektov, manipulujete s myšlienkou zásobníka a posledným (prvým) prvkom poľa, môžete získať dynamiku: samotné objekty „rozhodujú“ o tom, ako by mala fungovať funkčnosť stránky v závislosti od aktuálnej situácie .

V PHP je menný priestor špeciálnym druhom premennej reprezentovanej vlastným jedinečným názvom, často zložitým. Názov menného priestoru sa používa v kóde. Ak ide o reťazec, môžete počas vykonávania skriptu nahradiť jednu medzeru inou.

Ak PHP používa názvy priestorov názvov ako hodnoty premenných, potom je to ešte sémanticky zaťažená syntax, dokonca silnejšia ako polia objektov.

Objekt je štruktúra a obsah, ktoré sa vyznačujú jednotou. Menný priestor je súbor objektov, prvkov a vzťahov medzi nimi.

Nie je možné vykonávať experimenty na spustenom systéme, ale vďaka priestoru názvov poskytuje PHP možnosť simulovať skutočný bežiaci systém v inom priestore na účely:

  • ďalší vývoj;
  • testovanie;
  • údržbu atď.

Ak abstrahujeme od syntaxe navrhnutej vývojármi PHP a predstavíme si menné priestory ako globálne komplexné systémy objektov, potom sa obzory možností mnohonásobne rozšíria.

Syntax a použitie menného priestoru

PHP akceptuje len slovný priestor názvov v prvom riadku kódu v každom súbore. Všetky popisy musia nasledovať len za ním. Syntax obsahuje iba názov označený v obvyklom zmysle mena.

Je dôležité používať správne slová, ktoré vyjadrujú význam. Je lepšie, keď je názov dlhý, ale obsahuje niečo, čo dáva jasne najavo, o akom priestore hovoríme, čo robí, čo popisuje, čo akceptuje alebo na čo bol vytvorený.

Priestory môžu byť vnorené donekonečna, ale nemalo by sa to nadmerne využívať. Názov musí byť jasný, vkladanie musí byť odôvodnené a postupnosť názvov medzier musí mať logiku.

V aplikáciách použitia a priestoru názvov umožňuje PHP zložité kódovanie, ale vždy, keď je to možné, je lepšie použiť jednoduchú možnosť.

Všeobecné pravidlo je: namespace je popis a toto je jeden súbor, použitie je importovanie priestoru do skriptu použitia a priradenie aliasu (krátky odkaz).

Jednoduchý príklad tried automatického načítania (objektov)

Úloha obsahuje objekt na manipuláciu s reťazcami, štýlmi prvkov stránky (popisy CSS), objektom dátumu, objektom systému súborov a objektom databázy. Cieľom implementácie je vytvoriť jednoduché rozhrania pre týchto päť pozícií, aby sa potrebné schopnosti využívali len prostredníctvom metód týchto objektov.

Nie je povolené žiadne priame používanie jazykových funkcií a konštruktov. Táto úloha používa automatické načítanie triedy PHP. Priestor názvov sa považuje za kolekciu objektov umiestnených na špecifickom mieste v systéme súborov. Zvyčajne sú všetky objekty umiestnené v súborovom systéme podľa ich významu, v priečinkoch a v súboroch so špecifickým názvom.

Kód vľavo označuje vytvorenie požadovaných piatich objektov, ale nie je uvedené, kde presne sa nachádzajú. Kód vpravo zobrazuje text autoloaderu (hlavného skriptu), ktorý pri načítaní tried (objektov) automaticky nahradí požadovanú cestu k umiestneniu objektu a príponu súboru .php.

Príklad viacerých menných priestorov

Knižnica PhpOffice/PhpWord je dobrým príkladom použitia komplexnej hierarchie viacerých menných priestorov. Priečinok prvky obsahuje takmer celú škálu prvkov dostupných pri vytváraní dokumentu *.docx (MS Word), ostatné priečinky obsahujú potrebné nástroje na prácu s prvkami, odsekmi a tabuľkami.

V skutočnosti bola knižnica umiestnená do priečinka projektu z dôvodu, že priestor funkcií PhpOffice / PhpWord bolo potrebné doplniť špecifickými nástrojmi a nakoniec vytvoriť vlastnú verziu podobného produktu.

Načítava sa veľa tried rôznych menných priestorov

Použitie autoloadu PHP menného priestoru, keď je potrebné načítať veľa tried a hierarchia vyvinutého systému objektov je pomerne zložitá a ťažko predstaviteľná, vedie k potrebe vytvárať rigidné štruktúry.

Orientácia vývojára (ktorý používa produkt na pokračovanie v práci) je možná len v kontexte sémantiky (pochopenia projektu), ktorú predstavujú vhodné kombinácie slov, ktoré odrážajú skutočný význam a vzťahy objektov.

Potreba použitia knižnice v individuálnom projekte vedie k vyriešeniu problému, ako skombinovať menný priestor vývojára a PhpOffice / PhpWord autora. Najlepším spôsobom je umiestniť tento produkt (jeho priestory a objekty) do vlastného projektového priestoru.

Je dôležité si uvedomiť, že bez úpravy menných priestorov tohto produktu na úrovni jeho abstraktných prvkov a načítavania tried sa nezaobíde. To naznačuje, že v mennom priestore PHP nemusí byť použitie interných menných priestorov dostatočne abstraktné a univerzálne.

Lokalizácia súborového systému a priestoru

Menné priestory sú v podstate „nákresom“ cesty v súborovom systéme k požadovanému objektu. Používanie názvov súborov ako názvov objektov je prirodzené a bežné. Použitie názvov priečinkov ako pomenovania priestoru názvov je objektívne.

„Drevená“ organizácia informácií je dosť ťažkopádna na používanie a komplikuje vývoj, ale je prirodzenou reprezentáciou systémov objektov.

Problém je v tom, že vývojovú fázu predstavuje špecifický editor kódu, ktorý kombinuje viditeľnú reprezentáciu priečinkov aj obsah konkrétneho priečinka, no zatiaľ neexistuje žiadny editor, ktorý by zabezpečoval pohyb po objektoch a cez priečinky.

Problém abstrakcie a univerzálnosti

Akceptované vedomím a cieľom vývojára v skutočnosti:

  • poskytuje abstrakciu a schopnosť manipulovať s informáciami podľa ich skutočnej sémantiky;
  • menné priestory odrážajú pozíciu skriptov, objektov a čiastočne aj význam projektu v súborovom systéme

V skutočnosti pripojením OOP abstrakcie k názvom objektov (súborom) a jej prekrytím na súborovom systéme (priečinkom) s adekvátnou tvorbou menného priestoru (cesty + mená), môžete kontrolovať vytváranie menných priestorov počas vykonávania skriptu.

Programovanie už nadobudlo silnú dynamiku vývoja, ale ak prenesieme proces a zaťaženie vývojovej fázy z textového editora (v ktorom sa skripty vytvárajú a umiestňujú do stromov priečinkov) na myšlienku generovania kódu, ktorý umožňuje sa vylepšiť a umiestniť na správne miesto v súborovom systéme - programovanie sa povznesie do nových výšin.

Nedávno som zapuzdril svoj projekt do menného priestoru a narazil som na problém nedostatku riadnej dokumentácie. Všetko, čo sa nám podarilo nájsť, pochádza približne z roku 2009, a je takmer rok 2012... V nájdených materiáloch je veľa nefunkčných miest, ktoré používajú niečo, čo v aktuálnej verzii php nie je. V tejto súvislosti by som rád vniesol trochu svetla do tejto problematiky.
Čo je teda priestor názvov alebo priestor názvov? Veľká wikipedia ich definuje takto:

Menný priestor je množina, ktorá znamená model, abstraktné úložisko alebo prostredie vytvorené na logické zoskupovanie jedinečných identifikátorov (teda mien). Identifikátor definovaný v mennom priestore je spojený s týmto menným priestorom. Ten istý identifikátor môže byť nezávisle definovaný vo viacerých priestoroch. Hodnota spojená s identifikátorom definovaným v jednom mennom priestore teda môže (alebo nemusí) mať rovnaký (alebo skôr odlišný) význam ako rovnaký identifikátor definovaný v inom mennom priestore. Jazyky zohľadňujúce priestor názvov definujú pravidlá, ktoré označujú, do ktorého priestoru názvov identifikátor patrí (teda jeho definícia).wiki

Všetko jasné? Je to vlastne jednoduché. Pred verziou 5.3 boli v php iba dva priestory – globálne (v ktorom bol vykonaný váš hlavný kód) a lokálne (v ktorom boli definované funkčné premenné).

Od verzie 5.3 sa všetko zmenilo. Teraz môžete definovať svoj menný priestor, v ktorom budú existovať vaše triedy, metódy atď.


Dúfam, že to bolo trochu jasnejšie.

Triedy som konkrétne pomenoval rovnako. Keďže sú definované v rôznych priestoroch, napriek rovnakým názvom ide o dve rôzne triedy. Hlavný skript stále funguje v globálnom priestore, nič sa tu nezmenilo a stále sa v ňom dajú definovať triedy a funkcie. Tak načo sú potom priestory? Po prvé, aby ste sa uistili, že keď zahrniete súbor s nejakým rámcom alebo knižnicou, vaše triedy neprepíšu triedy rámca alebo naopak.

Ak chcete použiť triedy definované vo vašom mennom priestore, musíte na správnom mieste importovať priestor, ktorý definujete, do globálneho (zvyčajne to robím na začiatku súboru, použite kľúčové slovo use).

Pozor: z nejakého dôvodu php neumožňuje použitie kľúčového slova použitie v stavových blokoch a slučkách

Vezmime si príklad z obrázkov a implementujeme ho do kódu:

Pozor: kľúčové slovo menného priestoru musí byť umiestnené na úplnom začiatku súboru, hneď za ním
súbor A.php
súbor B.php
Je možná alternatívna syntax:
Odporúča sa deklarovať každý menný priestor v samostatnom súbore. Aj keď je to možné v jednom, prísne sa to neodporúča!
Teraz prejdime k tretiemu súboru, v ktorom bude fungovať náš hlavný skript
index.php
Zdalo by sa, že je to výhoda, len sa pridáva ďalší kód, ale nie je to celkom pravda, o kúsok ďalej uvediem príklad triedy autoload, s ktorou budú zbytočné riadky spájajúce súbory s triedami.
Teraz sa pozrime na naše triedy.

Pozor: pomocou operátora rozlíšenia rozsahu (::) v menných priestoroch php nepovolené! Jediná vec, na ktorú je vhodný, je prístup k metódam a konštantám statických tried. Najprv ho chceli použiť pre menný priestor, ale potom sa od neho rozhodli kvôli problémom, ktoré sa vyskytli. Preto konštrukcia ako A::A::say(); je neplatný a bude mať za následok chybu.

Pre priestory názvov musíte použiť znak spätnej lomky "\"
Pozor: Aby sa predišlo nedorozumeniam, je potrebné tento znak pri použití v reťazcoch zakódovať: "\\"

Menné priestory môžu byť vnorené do seba, pridajme do nášho súboru A.php:
a do indexu napíšeme nasledovné:

Dôležitým bodom je použitie aliasov pre importované priestory. Môžete napísať A\subA::say(); Súhlasíte s tým, že je ťažké zakaždým písať úplné cesty k medzerám, aby sa tomu zabránilo, boli zavedené aliasy. Pri kompilácii sa stane nasledovné: namiesto aliasu sub sa nahradí A\subA, takže dostaneme volanie A\subA::say();

Čo sa potom stane pri volaní funkcií definovaných v globálnom priestore? PHP najskôr hľadá funkciu v priestore, kde práve pracujete, a ak ju nenájde, prejde do globálneho rozsahu. Ak chcete okamžite uviesť, že používate globálnu funkciu, musíte pred ňou uviesť opačnú lomku.

Aby sa predišlo problémom s automatickým načítavaním tried z priestorov, súborový systém musí byť organizovaný podobne ako organizácia priestorov. Napríklad máme koreňový priečinok tried, kde budú uložené naše triedy, potom môžu byť naše priestory usporiadané nasledovne
triedy\A\A.php
class\A\sub\A.php (podpriestor bude umiestnený v samostatnom súbore)
triedy\B\B.php

PHP má magickú konštantu __NAMESPACE__, ktorá obsahuje názov aktuálneho priestoru.

A teraz o automatickom načítaní.

Trieda nižšie nie je moja, len som ju sfunkčnil a trochu vylepšil, prevzaté odtiaľto.
Pozor: Aby sa vaše triedy načítali, názov triedy sa musí zhodovať s názvom súboru!

".$file." v " .$filepath)); if (file_exists($filepath)) ( if(Autoloader::debug) Autoloader::StPutFile(("connected " .$filepath)); $flag = FALSE; required_once($filepath); break; ) Autoloader::recursive_autoload($file, $cesta2, &$príznak ) ) closedir($handle ) súkromná statická funkcia StPutFile($data) ( $dir = $_SERVER["DOCUMENT_ROOT"] ." /); Log/Log.html"; $file = fopen($dir, "a"); flock($file, LOCK_EX); fwrite($file, ("║" .$data ."=>" .date(" d.m.Y) Jeho") ."

" .PHP_EOL)); flock($súbor, LOCK_UN); fclose ($súbor); ) ) \spl_autoload_register("vašeMenoSpace\Autoloader::autoload"); )
Ak sa pozriete na názvy tried, ktoré prichádzajú na načítanie, uvidíte, že každej triede predchádza predpona z menného priestoru, ktorý sa používa. To je dôvod, prečo odporúčam použiť umiestnenie súborov v adresároch podobných mennému priestoru, čo urýchli vyhľadávanie na jednu alebo dve iterácie.

Teraz môže byť náš index napísaný takto:
Teraz sa automaticky načítajú všetky triedy a rozhrania, ktoré budete používať.

Aby sme demonštrovali niektoré dynamické schopnosti jazyka s medzerami, deklarujme ďalšiu triedu:
test.php

Index.php
sayName("test"); //alebo môžete urobiť tento test\sayName("test2"); //alebo takto $obj::sayName("test"); //alebo môžete urobiť tento test::sayName("test2");

Dúfam, že môj článok bude pre niekoho užitočný.

Ahoj. V dnešnom článku sa pozrieme na to, čo sú menné priestory v PHP.

Ak ho používate dlhší čas OOP, potom ste sa pravdepodobne stretli so situáciou, keď pri pripájaní knižnice tretej strany došlo k zlyhaniu v dôsledku skutočnosti, že vo svojom kóde už používate rovnaké názvy tried ako v knižnici. To sa môže stať najmä vtedy, ak používate bežné názvy ako napr "Model", "db" a tak ďalej. Teraz vám poviem, ako to opraviť.

Menný priestor- ide o akési úložisko vytvorené pre abstraktné zoskupovanie jedinečných identifikátorov (názvov).

Tie. ak použijete menné priestory, potom môžete bezpečne pripojiť knižnice tretích strán a nemusíte sa báť, že budú mať rovnaké názvy ako vo vašom kóde. Skončime s teóriou a prejdime k praxi.

Vytvorme súbor mojatrieda.php s týmto obsahom

menný priestor my\oneProject;
trieda MojaTrieda ( )
?>

Tu sme vytvorili triedu v mennom priestore my\oneProject. Mimochodom, musíte napísať presne spätnú lomku. Nenechajte sa zmiasť!

Teraz v súbore index.php napíšeme nasledovné

require_once("myclass.php");
$mc = new MyClass(); // Chyba: trieda sa nenašla
$mc = new my\oneProject\MyClass(); // všetko funguje
?>

Ako vidíte, teraz nie je možné vytvoriť triedu len tak, musíte zadať v ktorej menný priestor on leží.

Môžeme určiť niekoľko naraz menné priestory v jednom súbore

projekt menného priestoru;

Const CONNECT_OK = 1;
Pripojenie triedy ( )
funkcia connect() ( )

Menný priestorInýProjekt;

Const CONNECT_OK = 1;
Pripojenie triedy ( )
funkcia connect() ( )
?>

Napriek tomu, že máme absolútne identické názvy tried, funkcií a konštánt, nebudeme mať konflikt mien, pretože ležia v rôznych priestoroch.

Môžeme použiť aj syntax zátvoriek.

projekt menného priestoru (

Const CONNECT_OK = 1;
Pripojenie triedy ( )
funkcia connect() ( )
}

Menný priestor InýProjekt (

Const CONNECT_OK = 1;
Pripojenie triedy ( )
funkcia connect() ( )
}
?>

Ak skombinujete kód do globálny menný priestor s kódom v iných priestoroch, potom sa použije iba syntax so zátvorkami.

projekt menného priestoru (

Const CONNECT_OK = 1;
Pripojenie triedy ( )
funkcia connect() ( )
}

Priestor názvov ( // globálny kód
session_start();
$a = Project\connect();
echo Project\Connection::start();
}
?>

Tiež nezabudnite, že definovanie menného priestoru by malo byť vždy prvým riadkom kódu. Ak to napíšete takto, bude chyba

Ak chcete zistiť, v ktorom mennom priestore sa práve nachádzate, môžete použiť konštantu __NAMESPACE__

projekt menného priestoru;
echo "", __NAMESPACE__, """; // vytlačí "Projekt"
?>

Pomocou tejto konštanty môžete napríklad dynamicky vytvárať názvy

projekt menného priestoru;

Function incl($classname) (
$a = __NAMESPACE__ . "\\". $classname;
vrátiť nové $a;
}
?>

Tak to je na dnes všetko. Absolvovaním kurzu môžete získať ďalšie informácie a praktické znalosti