Primjeri korištenja prostora imena u php. Imenski prostori u PHP-u, objašnjeno. Globalni imenski prostor


  • Prevod
  • Tutorial
Napomena per.: Svestan sam da je u trenutku prevođenja trenutna verzija PHP-a 5.5, kao i da postoji mudra priručnik. Ali bilo mi je zanimljivo kako autor predstavlja funkcionalnost prostora imena. Možda će članak pomoći nekima od onih koji tek uče osnove (i ne samo drugima, ima mnogo bradatih programera koji su se odlučili na PHP 5.2). Hodor.

U PHP-u, počevši od verzije 5.3, pojavili su se prostori imena. Većina modernih jezika odavno ima ovu funkcionalnost, ali PHP je malo zakasnio. Međutim, svaka nova funkcija ima svoju svrhu, hajde da saznamo kako možemo imati koristi od korištenja imenskog prostora.

U PHP-u ne možete imati dvije klase koje se nazivaju istim imenom, sve moraju biti jedinstvene. Problem sa ovim ograničenjem je u tome što ako koristite nečiju biblioteku treće strane koja pruža klasu koja se zove User, onda ne možete kreirati sopstvenu klasu koja se takođe zove User. Ovo je zaista loše, jer je User vrlo zgodno ime za klasu, zar ne?

Prostori imena nam omogućavaju da zaobiđemo ovaj problem, a možemo kreirati onoliko korisničkih klasa koliko nam je potrebno. Prostori imena nam takođe omogućavaju da organizujemo naš kod u prikladne pakete, kao i da ukažemo na naše vlasništvo nad tim kodom.

Pogledajmo vrlo uobičajenu klasu. Da... Znam da ste ih već koristili, kakve veze imenski prostori imaju s tim? Samo mi vjeruj u vezi ovoga, ok?

Globalni imenski prostor

Evo vrlo jednostavne klase:
Ništa posebno kao što vidite, a ako želite da ga koristite, uradite ovo:
Dale, ja nekako znam PHP...

Ok, ok, izvini. Poenta je da ovu klasu možemo zamisliti kao da je u globalnom imenskom prostoru. Nisam sasvim siguran da je to pravi termin, ali meni zvuči sasvim prikladno. Zapravo, to znači da klasa ne pripada nijednom paketu, već samo običnoj klasi.

Jednostavna upotreba imenskih prostora

Hajde da napravimo još jednog Edarda, pored globalnog.
Ovdje imamo vrlo sličnu klasu sa jednom malom promjenom, dodatkom direktive imenskog prostora. String imenski prostor Stark; govori PHP-u da radimo u Stark imenskom prostoru i svaki kod (deklarisanje klasa, funkcija, varijabli, itd.) će se odnositi na njega.

Dakle, moramo kreirati novi Edd, ako odlučite da to treba učiniti ovako:
Dakle, ne, to nije istina. Ovdje dobijamo instancu klase iz prvog primjera koji smo kreirali ranije. Ne onaj u Stark imenskom prostoru. Pokušajmo stvoriti primjerak Eddarda Starka.
Da bismo kreirali instancu klase, potrebno je da nazivu klase dodamo prefiks iz imenskog prostora kojem klasa pripada i da ga koristimo kao graničnik obrnuta kosa crta. Kao rezultat, imamo instancu tačno one klase koja nam je potrebna. Zar nije magično?

Usput, prostori imena mogu formirati proizvoljno složenu hijerarhiju, koristeći onoliko nivoa koliko je potrebno. Na primjer:
Ovo\Prostor imena\I\Klasa\Kombinacija\Je\Slupavo\Ali\Radi

Teorija relativnosti

Zapamtite kako sam vam rekao da PHP uvijek radi u odnosu na trenutni imenski prostor. Pogledajmo ovo na djelu:
Dodavanjem direktive imenskog prostora dajemo do znanja PHP-u da se nalazimo u Starkovom imenskom prostoru. Pošto smo upravo u njoj definisali Eddard klasu, to je upravo ono što ćemo dobiti. Vidite - sve je relativno.

Sada kada smo promijenili imenski prostor, imamo jedan mali problem. Imaš li ideju o čemu pričam? Kako sada dobiti naš originalni Eddard čas? Pa, onaj u globalnom svemiru?

Srećom, PHP ima trik koji nam omogućava da riješimo ovaj problem - jednostavnim dodavanjem \ imenu klase.
Videći glavnu kosu crtu, PHP shvata da treba da gledamo dalje od trenutnog imenskog prostora i kreira instancu klase koja nam je potrebna.

Sada iskoristite svoju maštu. Zamislite da imamo klasu iz drugog imenskog prostora pod nazivom Tully\Edmure. Sada ga trebamo koristiti unutar Starkovog prostora. A kako da ovo uradimo?

Još jednom, morali smo upotrijebiti obrnutu kosu crtu da idemo globalno prije instanciranja klase u Tully prostoru.

Općenito, pozivanje na klase iz drugih imenskih prostora poput ovog, korištenjem pune hijerarhije u imenu, može biti prilično zamorno. Ali, srećom, postoji opcija da napravite prečicu, pogledajmo:

Koristeći use direktivu, možemo dobiti klasu iz drugog imenskog prostora. Samo, molim vas, nemojte me pitati "zašto ovdje nismo stavili glavnu kosu jer ja jednostavno ne znam?" Koliko ja znam, ovo je jedini izuzetak. Ne, ovdje možete koristiti kosu crtu naprijed. ali u tome neće biti smisla.

Oh, još jedan mali trik! Našim uvezenim klasama možemo dati nadimke:
Koristeći ključnu riječ as, dali smo klasi Tully/Brynden nadimak Blackfish, što nam omogućava da koristimo novi nadimak da ga identifikujemo u trenutnom imenskom prostoru. Pametno, zar ne? Ovo je također vrlo zgodno ako trebate koristiti dvije klase s istim imenom unutar istog imenskog prostora:

Dajući Daenerys iz prostora Dothraki nadimak Khaleesi, možemo koristiti obje klase Daenerys. Prilično zgodno, tamo možemo koristiti sve potrebne klase u našoj aplikaciji.

Struktura

Imenski prostori nam također mogu pomoći da organiziramo naš kod. Da demonstriram.

Recimo da želim da kreiram biblioteku otvorenog koda. Volio bih kada bi drugi mogli koristiti moj kod, to bi bilo sjajno! Problem je u tome što su nazivi klasa u mom kodu bili u sukobu s korisnikovom vlastitom primjenom moje biblioteke. To bi bilo užasno nezgodno. Ovako bih ja riješio ovaj problem:
Dayle\Blog\Content\Post Dayle\Blog\Content\Page Dayle\Blog\Tag
Ovdje sam koristio svoje ime da pokažem da kod pripada meni i da odvojim svoj kod od korisničkog koda moje biblioteke. Unutar osnovnog imenskog prostora kreirao sam strukturu klasa prema njihovoj hijerarhiji.

Kada počnete koristiti composer, naučit ćete kako koristiti prostore imena da olakšate automatsko učitavanje koda. Toplo preporučujem da pogledate ovaj koristan mehanizam.

Nedostaci

Iskreno da vam kažem, osjećam se pomalo krivim što sam ovaj podnaslov nazvao "Nedostaci". Ono o čemu ću govoriti zapravo nije greška.

Činjenica je da je u drugim jezicima funkcionalnost imenskih prostora implementirana na sličan način, a u isto vrijeme jezici pružaju dodatnu funkcionalnost za interakciju s imenskim prostorima.

U Javi, na primjer, možete uvesti više klasa u trenutni imenski prostor koristeći naredbu import. U Javi, uvoz je analogan upotrebi i koristi tačke za odvajanje ugniježđenih imenskih prostora (ili paketa). Evo primjera:
import dayle.blog.*;
Ovo će uvesti sve klase u paketu 'dayle.blog'.

Ovo ne možete učiniti u PHP-u. Morate uvesti svaku klasu posebno. Izvini. Zapravo, zašto se izvinjavam? Samo naprijed i žalite se PHP razvojnom timu, ali molim vas da budete ljubazni. Uradili su mnogo zanimljivih stvari u poslednje vreme.

Evo jednog zgodnog trika da malo ublažite problem. Zamislite da imamo strukturu klase iz prethodnog primjera. Možemo uzeti dio podprostora i dati mu pseudonim.
Ovo može biti korisno kada se koristi veliki broj klasa. Bravo za sve!

Sve želje i sugestije ću rado prihvatiti u ličnoj poruci, hvala.

Varijabla definira vrijednost, ali može biti referenca na drugu varijablu i imati svoju vrijednost. Tokom izvršavanja algoritma, varijabla obično poprima mnogo različitih vrijednosti. Konstanta pohranjuje samo jednu vrijednost. Objekt je nepredvidiv: ima tendenciju da ima strukturu, sadržaj i mnoge karakteristike.

Imenski prostor je zbirka varijabli, konstanti, objekata, funkcija i drugih konstrukcija koje je kreirao programer na koje se može referencirati kroz ime ovog imenskog prostora.

Imena: sfera opisa podataka i algoritama

Imena elemenata (varijable, konstante, objekti, funkcije i druge konstrukcije programera) se nikada ne presijecaju. PHP svako podudaranje imena tumači kao ozbiljnu grešku, a u slučajevima kada ne može jasno da identifikuje problem, programer dobija kod koji ne radi kako je predviđeno, ili bijelu kutiju u pretraživaču.

Sva imena svih podataka moraju biti jedinstvena jer je prostor globalan. Imena objekata i funkcija takođe ne bi trebalo da se ponavljaju, ali je opseg globalne vidljivosti prekinut u tijelima metoda objekata i funkcija. Ima svoj lokalni nazivni prostor i ništa vas ne sprečava da nečemu date naziv interno na isti način kao što je naznačeno spolja.

Gornji primjer je klasičan, ako ne obratite pažnju na ključnu riječ namespace: sve je kao i uvijek. Drugi uključuju radove. Prefiks NameSpaceTwo\ ispred imena funkcija određuje iz kojeg je umetka preuzet kod.

Ako uklonimo globalnu ključnu riječ i operaciju iz prve funkcije $iExt = 1; prijeđite na red iznad, tada ni prva ni druga funkcija neće znati za vrijednost varijable 100.

Prostori imena: Višestruki opsegi opisa

Prikazani primjer ima zajedničku datoteku koja koristi dva umetanja. Svaki umetak ima istu funkciju scCheckName(). Koju će odabrati odlučuje programer koristeći naziv prostora koji je relevantan u pravo vrijeme na pravom mjestu u kodu.

Činjenica da je isto ime prisutno u zajedničkom kodu (nakon spajanja umetanja) ne rezultira greškom iz jednostavnog razloga što je svaka datoteka za umetanje označena svojim jedinstvenim imenom.

U prvom fajlu sve što će biti opisano u njemu povezano je sa imenom NameSpaceOne. U drugom fajlu, svi opisi će biti povezani sa imenom NameSpaceTwo.

Svako dupliciranje imena u oba fajla je dozvoljeno, ali u svakoj od njih bilo koje ime elementa (varijabla, konstanta, objekat, funkcija) mora biti jedinstveno.

U ovom primjeru, promjena imena prostora imena u pozivu funkcije scCheckName() spriječila je promjenu varijable $iExt drugog imenskog prostora. Zato je u primjeru riječ „promijenjeno“ posebno istaknuta - promjena se zapravo nije dogodila. Vrijednost varijable ostaje ista.

Testiranje i višestruki dizajn

Ovi jednostavni primjeri pokazuju da lako možete pojednostaviti razvoj složenih projekata, povećati efikasnost, produktivnost i ubrzati rad. Definitivno su se odmah pojavile prve ideje za korištenje imenskih prostora:

  • sigurno testiranje skripti - zamjenom "radnih" prostora sa test analogima;
  • siguran dizajn od strane velikih timova programera - tako što im se obezbjeđuje „individualni“ prostor za opisivanje elemenata.

U stvari, imenski prostor je mnogo važniji. PHP jezik, imenski prostor i svaki element opisa (varijabla, konstanta, objekat...) dugo su davali programeru mogućnost da samostalno manipuliše sintaksom i semantikom.

Jezičke konstrukcije i opšte pravilo modernog programiranja: „razumeti” – izvršeno – postoji kontradikcija – „beli ekran” nema efekta na profesionalnog programera.

Mnogi programeri čak i ne znaju gdje da traže PHP poruku o grešci kada u pretraživaču nema ničega (prazno bijelo polje). U određenoj fazi svog razvoja, programer razmišlja u PHP sintaksi i semantici, „radi“ automatski i rezultat: sopstvena sintaksa i sopstvena semantika, u granicama dozvoljenog.

Bijeli ekran je trenutna nedvosmislena reakcija profesionalnog programera i greška je eliminisana. Zašto gubiti vrijeme na debuger i pregledavanje dnevnika grešaka?

Objekti, nizovi i prostori imena

Moglo bi se reći da su varijable, konstante i funkcije stvar prošlosti, ali se koriste u dizajnu objekata. Dobar kod je kada je algoritam predstavljen interaktivnim objektima, a ne nizom ispravnih konstrukcija.

Ako koristite nizove objekata, manipulirate idejom o steku i posljednjim (prvim) elementom niza, možete dobiti dinamiku: sami objekti "odlučuju" kako bi funkcionalnost stranice trebala funkcionirati ovisno o trenutnoj situaciji .

U PHP-u, imenski prostor je posebna vrsta varijable, predstavljena sopstvenim jedinstvenim imenom, često složenim. Ime prostora imena se koristi u kodu. Ako je ovo string, onda možete zamijeniti jedan razmak drugim tokom izvršavanja skripte.

Ako PHP koristi imena prostora imena kao vrijednosti varijabli, onda je ovo još semantički opterećena sintaksa, čak i jača od nizova objekata.

Objekt je struktura i sadržaj koji karakterizira jedinstvo. Imenski prostor je skup objekata, elemenata i odnosa između njih.

Nije moguće izvoditi eksperimente na pokrenutom sistemu, ali zahvaljujući imenskom prostoru, PHP pruža mogućnost simulacije stvarnog pokrenutog sistema u drugom prostoru u svrhe:

  • dalji razvoj;
  • testiranje;
  • održavanje itd.

Ako apstrahujemo od sintakse koju su predložili PHP programeri i zamislimo prostore imena kao globalne složene sisteme objekata, tada se horizonti mogućnosti višestruko šire.

Sintaksa i upotreba prostora imena

PHP prihvata samo imenski prostor riječi u prvom redu koda u svakoj datoteci. Svi opisi moraju pratiti samo ovaj. Sintaksa uključuje samo ime označeno u uobičajenom smislu imena.

Važno je koristiti ispravne riječi koje prenose značenje. Bolje je kada je naziv dugačak, ali sadrži nešto što daje jasnu sliku o kojem prostoru govorimo, šta radi, šta opisuje, šta prihvata ili za šta je stvoren.

Prostori se mogu ugniježđivati ​​neograničeno, ali to ne treba previše koristiti. Ime mora biti jasno, ugniježđenje mora biti opravdano, a niz imena prostora mora imati logiku.

U aplikacijama za upotrebu i imenski prostor, PHP dozvoljava složeno kodiranje, ali kad god je to moguće, bolje je koristiti jednostavnu opciju.

Opšte pravilo je: imenski prostor je opis i ovo je jedan fajl, upotreba je uvoz prostora u skriptu korišćenja i dodeljivanje aliasa (kratke veze) za njega.

Jednostavan primjer automatskog učitavanja klasa (objekata)

Zadatak sadrži objekt za manipulaciju stringovima, stilove elemenata stranice (CSS opisi), objekt datuma, objekt sistema datoteka i objekt baze podataka. Smisao implementacije je kreiranje jednostavnih interfejsa za ovih pet pozicija kako bi se koristile potrebne mogućnosti samo kroz metode ovih objekata.

Nije dozvoljena direktna upotreba jezičkih funkcija i konstrukcija. Ovaj zadatak koristi automatsko učitavanje PHP klase. Imenski prostor se smatra zbirkom objekata koji se nalaze na određenoj lokaciji u sistemu datoteka. Obično se svi objekti nalaze u sistemu datoteka prema njihovom značenju, u fasciklama i datotekama sa određenim imenom.

Kod s lijeve strane označava kreiranje potrebnih pet objekata, ali nije naznačeno gdje se tačno nalaze. Kod sa desne strane prikazuje tekst autoloadera (glavne skripte), koji prilikom učitavanja klasa (objekata) automatski zamjenjuje traženu putanju do lokacije objekta i ekstenzije datoteke .php.

Primjer višestrukih imenskih prostora

PhpOffice/PhpWord biblioteka je dobar primjer korištenja složene hijerarhije višestrukih imenskih prostora. Fascikla Elementi sadrži gotovo čitav niz elemenata dostupnih prilikom kreiranja *.docx dokumenta (MS Word), ostali folderi sadrže potrebne alate za rad sa elementima, paragrafima i tabelama.

Zapravo, biblioteka je stavljena u fasciklu projekta iz razloga što je funkcionalni prostor PhpOffice / PhpWord trebalo dopuniti specifičnim alatima i na kraju kreirati sopstvenu verziju sličnog proizvoda.

Učitavanje mnogih klasa različitih imenskih prostora

Korišćenje PHP autoload namespace-a, kada je potrebno učitati mnoge klase, a hijerarhija razvijenog sistema objekata prilično složena i teško zamisliva, dovodi do potrebe za stvaranjem krutih struktura.

Orijentacija programera (koji koristi proizvod za nastavak rada) moguća je samo u kontekstu semantike (razumijevanja projekta), što je predstavljeno odgovarajućim kombinacijama riječi koje odražavaju pravo značenje i odnose objekata.

Potreba za korištenjem biblioteke u pojedinačnom projektu dovodi do rješavanja problema kako kombinirati prostore imena programera i PhpOffice / PhpWord autora. Najbolji način je da ovaj proizvod (njegove prostore i objekte) smjestite u vlastiti projektni prostor.

Važno je napomenuti da neće biti moguće bez modifikacije imenskih prostora ovog proizvoda na nivou njegovih apstraktnih elemenata i učitavanja klasa. Ovo ukazuje da u PHP imenskom prostoru upotreba internih imenskih prostora možda nije dovoljno apstraktna i univerzalna.

Sistem datoteka i lokalizacija prostora

U suštini, prostori imena su "ocrtavanje" putanje u sistemu datoteka do željenog objekta. Korištenje imena datoteka kao imena objekata je prirodno i uobičajeno. Korištenje imena foldera kao imenskog prostora je cilj.

“Drvena” organizacija informacija je prilično glomazna za korištenje i komplikuje razvoj, ali je prirodna reprezentacija za sisteme objekata.

Problem je u tome što razvojnu fazu predstavlja određeni uređivač koda, koji kombinuje i vidljivu reprezentaciju fascikli i sadržaj određene fascikle, ali još ne postoji uređivač koji bi omogućio kretanje od kraja do kraja kroz objekte i kroz foldere.

Problem apstrakcije i univerzalnosti

Prihvaćeno od strane programera svijesti i cilj u stvarnosti:

  • pruža apstrakciju i sposobnost manipulacije informacijama u skladu sa njihovom stvarnom semantikom;
  • imenski prostori odražavaju poziciju skripti, objekata i dijelom značenje projekta u sistemu datoteka

U stvari, povezivanjem OOP apstrakcije sa imenima objekata (fajlova) i preklapanjem na sistem datoteka (fascikle) sa adekvatnim formiranjem prostora imena (staze + imena), možete kontrolisati formiranje prostora imena tokom izvršavanja skripte.

Programiranje je već dobilo moćnu dinamiku razvoja, ali ako proces i opterećenje faze razvoja prenesemo sa uređivača teksta (u kojem se kreiraju skripte i stavljaju u stabla foldera) na ideju ​​generiranja koda koji dozvoljava da se poboljša i postavi na pravo mjesto u sistemu datoteka - programiranje će se podići na nove visine.

Nedavno sam inkapsulirao svoj projekat u imenskom prostoru i naišao na problem nedostatka odgovarajuće dokumentacije. Sve što smo uspjeli pronaći datira otprilike iz 2009. godine, a skoro je 2012. godine... U pronađenom materijalu ima dosta neradnih mjesta koja koriste nešto što nije u trenutnoj verziji php-a. S tim u vezi, želio bih malo rasvijetliti ovo pitanje.
Dakle, šta je imenski prostor ili imenski prostor? Velika wikipedija ih ovako definira:

Prostor imena je skup, što znači model, apstraktno skladište ili okruženje kreirano za logičko grupisanje jedinstvenih identifikatora (tj. imena). Identifikator definiran u imenskom prostoru je pridružen tom imenskom prostoru. Isti identifikator može se nezavisno definisati u više prostora. Dakle, vrijednost povezana s identifikatorom definiranim u jednom imenskom prostoru može (ili ne mora) imati isto (ili radije drugačije) značenje kao isti identifikator definiran u drugom imenskom prostoru. Jezici svjesni imenskog prostora definiraju pravila koja pokazuju kojem imenskom prostoru pripada identifikator (tj. njegova definicija).wiki

Sve jasno? To je zapravo jednostavno. Prije verzije 5.3, postojala su samo dva prostora u php-u - globalni (u kojem se izvršavao vaš glavni kod) i lokalni (u kojem su bile definirane varijable funkcije).

Od verzije 5.3 sve se promijenilo. Sada možete definirati svoj prostor imena u kojem će postojati vaše klase, metode itd.


Nadam se da je postalo malo jasnije.

Izričito sam isto nazvao klase. Pošto su definisane u različitim prostorima, to su dve različite klase, uprkos istim imenima. Glavna skripta i dalje funkcionira u globalnom prostoru, ovdje se ništa nije promijenilo i u njoj se i dalje mogu definirati klase i funkcije. Pa čemu onda prostor? Prije svega, kako biste bili sigurni da kada uključite datoteku s nekim okvirom ili bibliotekom, vaše klase neće nadjačati klase okvira ili obrnuto.

Da biste koristili klase definisane u vašem imenskom prostoru, potrebno je da uvezete prostor koji definišete u globalni na pravom mestu (ja obično radije to radim na početku datoteke da biste to uradili, koristite ključnu reč).

pažnja: iz nekog razloga php ne dozvoljava upotrebu ključne riječi koristiti u blokovima stanja i petlji

Uzmimo primjer sa slika i implementirajmo ga u kodu:

pažnja: ključna riječ namespace mora se nalaziti na samom početku datoteke, odmah nakon
fajl A.php
B.php fajl
Moguća je alternativna sintaksa:
Preporučuje se deklarisanje svakog imenskog prostora u zasebnoj datoteci. Iako je moguće u jednom, to se striktno ne preporučuje!
Sada idemo na treću datoteku, u kojoj će funkcionirati naša glavna skripta
index.php
Čini se da je to prednost, dodaje se samo još koda, ali to nije sasvim točno, malo dalje ću dati primjer klase za automatsko učitavanje, s kojom će linije koje povezuju datoteke s klasama biti nepotrebne.
Pogledajmo sada naše časove.

pažnja: koristeći operator rezolucije opsega (::) u php imenskim prostorima nije dopusteno! Jedina stvar za koju je pogodan je pristup metodama statičke klase i konstantama. U početku su ga htjeli koristiti za imenski prostor, ali su se onda odlučili odbiti zbog problema koji su se pojavili. Stoga, konstrukcija poput A::A::say(); je nevažeća i rezultirat će greškom.

Za prostore imena morate koristiti obrnutu kosu crtu "\"
pažnja: Da biste izbjegli nesporazume, potrebno je izbjeći ovaj znak kada se koristi u nizovima: "\\"

Prostori imena mogu biti ugniježđeni jedan unutar drugog, dodajmo u našu A.php datoteku:
a u indeks ćemo napisati sljedeće:

Važna stvar je korištenje aliasa za uvezene prostore. Možete napisati A\subA::say(); Složićete se da je teško svaki put napisati pune putanje do prostora kako bi se to izbeglo, uvedeni su aliasi. Prilikom kompajliranja dogodit će se sljedeće: umjesto alias sub, A\subA će biti zamijenjen, tako da ćemo dobiti poziv A\subA::say();

Što se onda događa kada se pozivaju funkcije definirane u globalnom prostoru? PHP prvo traži funkciju unutar prostora u kojem trenutno radite, a ako je ne pronađe, prelazi u globalni opseg. Da biste odmah naznačili da koristite globalnu funkciju, morate joj prethoditi obrnutom kosom crtom.

Kako bi se izbjegli problemi sa automatskim učitavanjem klasa iz prostora, sistem datoteka mora biti organiziran slično organizaciji prostora. Na primjer, imamo root folder classes, gdje će naše klase biti pohranjene, tada se naši prostori mogu organizirati na sljedeći način
classes\A\A.php
classes\A\sub\A.php (podprostor će biti smješten u poseban fajl)
classes\B\B.php

PHP ima magičnu konstantu __NAMESPACE__ koja sadrži ime trenutnog prostora.

A sada o automatskom učitavanju.

Klasa ispod nije moja, samo sam je napravio i malo poboljšao, preuzeto odavde.
pažnja: Da bi se vaše klase učitale, ime klase mora odgovarati imenu datoteke!

".$file ." u " .$filepath)); if (file_exists($filepath))) ( if(Autoloader::debug) Autoloader::StPutFile(("connected " .$filepath)); $flag = FALSE; require_once($filepath); break ) Autoloader::recursive_autoload($path2, &$flag)) private static function StPutFile($data) ($dir = $_SERVER["DOCUMENT_ROOT"]); Log/Log.html"; $file = fopen($dir, "a"); flock($file, LOCK_EX); fwrite($file, ("║" .$data ."=>" .date(" d.m.Y H:i:s") ."

" .PHP_EOL)); flock($file, LOCK_UN); fclose ($file); ) ) \spl_autoload_register("yourNameSpace\Autoloader::autoload"); )
Ako pogledate imena klasa koje dolaze za učitavanje, vidjet ćete da svakoj klasi prethodi prefiks iz imenskog prostora koji je specificiran u upotrebi. Zbog toga preporučujem korištenje lokacije datoteka u direktorijima sličnim imenskom prostoru; ovo ubrzava pretragu na jednu ili dvije iteracije.

Sada se naš indeks može napisati ovako:
Sada će se sve klase i interfejsi koje ćete koristiti automatski učitati.

Da bismo demonstrirali neke od dinamičkih mogućnosti jezika s razmacima, deklarirajmo drugu klasu:
test.php

Index.php
sayName("test"); //ili možete uraditi ovaj test\sayName("test2"); //ili ovako $obj::sayName("test"); //ili možete uraditi ovaj test::sayName("test2");

Nadam se da će moj članak nekome biti od koristi.

Zdravo. U današnjem članku ćemo pogledati, šta su imenski prostori u PHP-u.

Ako ga koristite duže vrijeme OOP, onda ste vjerovatno naišli na situaciju u kojoj ste, prilikom povezivanja biblioteke treće strane, doživjeli neuspjeh zbog činjenice da već koristite ista imena klasa u svom kodu kao u biblioteci. Ovo se posebno može dogoditi ako koristite uobičajena imena kao što su "model", "db" i tako dalje. Sada ću vam reći kako to popraviti.

Imenski prostor- ovo je neka vrsta skladišta stvorena za apstraktno grupisanje jedinstvenih identifikatora (imena).

One. ako koristite imenski prostori, tada možete sigurno povezati biblioteke trećih strana i ne plašiti se da će imati ista imena kao u vašem kodu. Završimo sa teorijom i pređimo na praksu.

Kreirajmo fajl myclass.php sa ovim sadržajem

imenski prostor moj\oneProject;
razred MyClass ( )
?>

Ovdje smo kreirali klasu u imenskom prostoru my\oneProject. Usput, morate napisati tačno obrnutu kosu crtu. Nemojte se zbuniti!

Sada u fajlu index.php hajde da napišemo sledeće

require_once("myclass.php");
$mc = nova MyClass(); // Greška: klasa nije pronađena
$mc = novi moj\oneProject\MyClass(); // sve radi
?>

Kao što vidite, sada nije moguće kreirati klasu tek tako, morate odrediti u kojoj imenskog prostora on leži.

Možemo navesti nekoliko odjednom imenski prostori u jednom fajlu

namespace Project;

Konst CONNECT_OK = 1;
klasa veza ( )
funkcija connect() ( )

NamespaceAnotherProject;

Konst CONNECT_OK = 1;
klasa veza ( )
funkcija connect() ( )
?>

Uprkos činjenici da imamo apsolutno identična imena klasa, funkcija i konstanti, nećemo imati sukob imena, jer leže u različitim prostorima.

Također možemo koristiti sintaksu zagrada.

imenski projekat (

Konst CONNECT_OK = 1;
klasa veza ( )
funkcija connect() ( )
}

Imenski prostor AnotherProject (

Konst CONNECT_OK = 1;
klasa veza ( )
funkcija connect() ( )
}
?>

Ako kombinirate kod u globalni imenski prostor sa kodom u drugim prostorima, tada se koristi samo sintaksa sa zagradama.

imenski projekat (

Konst CONNECT_OK = 1;
klasa veza ( )
funkcija connect() ( )
}

Imenski prostor ( // globalni kod
session_start();
$a = Project\connect();
echo Project\Connection::start();
}
?>

Također, ne zaboravite da definiranje prostora imena uvijek treba biti prva linija koda. Ako ovako pišete doći će do greške

Da biste saznali u kojem se imenskom prostoru trenutno nalazite, možete koristiti konstantu __NAMESPACE__

namespace Project;
echo """, __NAMESPACE__, """; // će ispisati "Projekat"
?>

Koristeći ovu konstantu možete, na primjer, dinamički konstruirati imena

namespace Project;

Funkcija incl($classname) (
$a = __NAMESPACE__ . "\\" . $classname;
vrati novi $a;
}
?>

To je sve za danas. Više informacija i praktičnih znanja možete dobiti pohađanjem kursa