Primeri uporabe imenskega prostora v php. Imenski prostori v PHP, razloženo. Globalni imenski prostor


  • Prevajanje
  • Vadnica
Opomba per.: Zavedam se, da je v času prevoda trenutna različica PHP 5.5 in tudi, da obstaja pameten priročnik. Zanimivo pa se mi je zdelo, kako avtor predstavi funkcionalnost imenskega prostora, morda bo članek pomagal komu od tistih, ki se šele učijo osnov (in ne le drugim, veliko je bradatih razvijalcev, ki so se odločili za PHP 5.2). Hodor.

V PHP so se od različice 5.3 pojavili imenski prostori. Večina sodobnih jezikov že dolgo ima to funkcionalnost, PHP pa je nekoliko zamujal. Vendar ima vsaka nova funkcija svoj namen, poglejmo, kako nam lahko koristi uporaba imenskega prostora.

V PHP ne morete imeti dveh razredov z enakim imenom, vsi morajo biti edinstveni. Težava s to omejitvijo je, da če uporabljate knjižnico tretje osebe nekoga drugega, ki nudi razred z imenom Uporabnik, potem ne morete ustvariti lastnega razreda z imenom Uporabnik. To je res slabo, saj je Uporabnik zelo priročno ime za razred, kajne?

Imenski prostori nam omogočajo, da se izognemo tej težavi in ​​lahko ustvarimo toliko uporabniških razredov, kot jih potrebujemo. Imenski prostori nam omogočajo tudi organiziranje naše kode v priročne pakete in nakazujejo naše lastništvo te kode.

Oglejmo si zelo pogost razred. Ja ... Vem, da si jih že uporabil, kaj imajo imenski prostori s tem? Samo zaupaj mi glede tega, prav?

Globalni imenski prostor

Tukaj je zelo preprost razred:
Nič posebnega, kot lahko vidite, in če ga želite uporabiti, naredite samo to:
Dale, nekako poznam PHP ...

V redu, v redu, oprosti. Bistvo je, da si lahko predstavljamo ta razred kot del globalnega imenskega prostora. Nisem povsem prepričan, da je to pravi izraz, vendar se mi zdi povsem primeren. Pravzaprav to pomeni, da razred ne pripada nobenemu paketu, le navaden razred.

Enostavna uporaba imenskih prostorov

Ustvarimo še enega Eddarda, poleg globalnega.
Tukaj imamo zelo podoben razred z eno majhno spremembo, dodatkom direktive imenskega prostora. Imenski prostor nizov Stark; pove PHP, da delamo v imenskem prostoru Stark in da se bo katera koli koda (deklariranje razredov, funkcij, spremenljivk itd.) nanašala nanj.

Torej moramo ustvariti novega Edda, če se odločite, da je treba to storiti takole:
Torej ne, to ni res. Tukaj dobimo primerek razreda iz prvega primera, ki smo ga ustvarili prej. Ne tistega v imenskem prostoru Stark. Poskusimo ustvariti primerek Eddarda Starka.
Če želimo ustvariti primerek razreda, moramo pred ime razreda dodati predpono iz imenskega prostora, ki mu razred pripada, in uporabiti kot ločilo poševnica nazaj. Kot rezultat imamo primerek točno tistega razreda, ki ga potrebujemo. Ali ni čarobno?

Mimogrede, imenski prostori lahko tvorijo poljubno zapleteno hierarhijo z uporabo poljubnega števila ravni. Na primer:
This\Namespace\And\Class\Combination\Is\Silly\But\Works

Teorija relativnosti

Ne pozabite, kako sem vam povedal, da PHP vedno deluje glede na trenutni imenski prostor. Oglejmo si to v akciji:
Z dodajanjem direktive imenskega prostora damo PHP vedeti, da smo v imenskem prostoru Stark. Ker smo v njem definirali razred Eddard, bomo dobili točno to. Glejte - vse je relativno.

Zdaj, ko smo spremenili imenski prostor, imamo eno majhno težavo. Ali veš, o čem govorim? Kako zdaj dobimo naš originalni razred Eddarda? No, tisti v globalnem prostoru?

Na srečo ima PHP trik, ki nam omogoča, da rešimo ta problem – preprosto tako, da imenu razreda dodamo \.
Ko vidi prvo poševnico, PHP razume, da moramo pogledati onkraj trenutnega imenskega prostora, in ustvari primerek razreda, ki ga potrebujemo.

Zdaj uporabite svojo domišljijo. Predstavljajte si, da imamo razred iz drugega imenskega prostora z imenom Tully\Edmure. Zdaj ga moramo uporabiti znotraj Starkovega prostora. In kako to naredimo?

Še enkrat smo morali uporabiti poševnico nazaj, da smo postali globalni, preden smo instancirali razred v prostoru Tully.

Na splošno je sklicevanje na razrede iz drugih imenskih prostorov, kot je ta, z uporabo celotne hierarhije v imenu, lahko precej dolgočasno. Toda na srečo obstaja možnost, da naredite bližnjico, poglejmo:

Z uporabo direktive use lahko dobimo razred iz drugega imenskega prostora. Samo prosim, ne sprašujte me "zakaj nismo tukaj postavili poševnice?", ker preprosto ne vem. Kolikor vem, je to edina izjema. Ne, tukaj lahko uporabite poševnico. ampak v tem ne bo nobenega pomena.

Oh, še en mali trik! Svojim uvoženim razredom lahko damo vzdevke:
Z uporabo ključne besede as smo razredu Tully/Brynden dali vzdevek Blackfish, ki nam omogoča uporabo novega vzdevka za njegovo identifikacijo v trenutnem imenskem prostoru. Pametno, kajne? To je tudi zelo priročno, če morate uporabiti dva razreda z enakim imenom znotraj istega imenskega prostora:

Če Daenerys iz vesolja Dothraki damo vzdevek Khaleesi, lahko uporabljamo oba razreda Daenerys. Precej priročno, tam lahko uporabimo vse potrebne razrede v naši aplikaciji.

Struktura

Imenski prostori nam lahko pomagajo tudi pri organizaciji kode. Naj pokažem.

Recimo, da želim ustvariti odprtokodno knjižnico. Vesel bi bil, če bi drugi lahko uporabili mojo kodo, to bi bilo super! Težava je v tem, da so imena razredov v moji kodi v nasprotju z uporabnikovo lastno aplikacijo moje knjižnice. Bilo bi zelo neprijetno. Takole bi rešil ta problem:
Dayle\Blog\Content\Post Dayle\Blog\Content\Page Dayle\Blog\Tag
Tu sem uporabil svoje ime, da pokažem, da koda pripada meni, in da ločim svojo kodo od uporabniške kode moje knjižnice. Znotraj osnovnega imenskega prostora sem ustvaril strukturo razreda glede na njihovo hierarhijo.

Ko začnete uporabljati Composer, se boste naučili uporabljati imenske prostore za lažje samodejno nalaganje kode. Zelo priporočam, da si ogledate ta uporaben mehanizem.

Napake

Če vam povem po pravici, se počutim malo krivega, ker sem ta podnaslov poimenoval "Slabosti." To, o čemer bom govoril, pravzaprav ni napaka.

Dejstvo je, da je v drugih jezikih funkcionalnost imenskih prostorov implementirana na podoben način, hkrati pa jeziki zagotavljajo dodatno funkcionalnost za interakcijo z imenskimi prostori.

V Javi lahko na primer uvozite več razredov v trenutni imenski prostor z uporabo stavka import. V Javi je uvoz podoben uporabi in uporablja pike za ločevanje ugnezdenih imenskih prostorov (ali paketov). Tukaj je primer:
import dayle.blog.*;
To bo uvozilo vse razrede v paketu 'dayle.blog'.

Tega ne morete storiti v PHP. Vsak razred morate uvoziti posebej. oprosti. Pravzaprav, zakaj se opravičujem? Kar naprej in se pritožite razvojni skupini PHP, vendar vas prosim, da ste vljudni. Zadnje čase so počeli marsikaj zanimivega.

Tukaj je krasen trik, s katerim boste težavo nekoliko ublažili. Predstavljajte si, da imamo strukturo razreda iz prejšnjega primera. Lahko vzamemo del podprostora in mu damo vzdevek.
To je lahko koristno pri uporabi velikega števila razredov. Dobro za vse!

Vse želje in predloge z veseljem sprejmem na osebno sporočilo, hvala.

Spremenljivka definira vrednost, lahko pa je sklic na drugo spremenljivko in ima njeno vrednost. Med izvajanjem algoritma spremenljivka običajno zavzame veliko različnih vrednosti. Konstanta hrani samo eno vrednost. Objekt je nepredvidljiv: ponavadi ima strukturo, vsebino in številne značilnosti.

Imenski prostor je zbirka spremenljivk, konstant, objektov, funkcij in drugih konstruktov, ki jih ustvari razvijalec, na katere se je mogoče sklicevati prek imena tega imenskega prostora.

Imena: področje opisa podatkov in algoritmov

Imena elementov (spremenljivke, konstante, objekti, funkcije in drugi konstrukti razvijalca) se nikoli ne sekajo. PHP vsako ujemanje imena razume kot resno napako in v primerih, ko ne more jasno prepoznati težave, razvijalec prejme kodo, ki ne deluje, kot je predvideno, ali bel okvirček v brskalniku.

Vsa imena vseh podatkov morajo biti unikatna, ker je prostor globalen. Imena objektov in funkcij se tudi ne smejo ponavljati, vendar je obseg globalne vidnosti prekinjen v telesih metod objektov in funkcij. Ima svoj lokalni imenski prostor in nič vam ne preprečuje, da bi nekaj interno poimenovali na enak način, kot je označeno zunaj.

Zgornji primer je klasičen, če niste pozorni na ključno besedo imenskega prostora: vse je kot vedno. Drugi vključujejo dela. Predpona NameSpaceTwo\ pred imeni funkcij določa, iz katerega vstavka je koda vzeta.

Če odstranimo globalno ključno besedo in operacijo iz prve funkcije $iExt = 1; premaknete v zgornjo vrstico, potem niti prva niti druga funkcija ne bosta vedeli za vrednost spremenljivke 100.

Imenski prostori: več obsegov opisa

Prikazani primer ima datoteko v skupni rabi, ki uporablja dva vstavka. Vsak vstavek ima isto funkcijo scCheckName(). Katerega bo izbral, se odloči programer tako, da na pravem mestu v kodi uporabi ime prostora, ki je relevantno ob pravem času.

Dejstvo, da je isto ime prisotno v skupni kodi (po združitvi vstavkov), ne povzroči napake iz preprostega razloga, ker je vsaka vstavljena datoteka označena s svojim edinstvenim imenom.

V prvi datoteki je vse, kar bo v njej opisano, povezano z imenom NameSpaceOne. V drugi datoteki bodo vsi opisi povezani z imenom NameSpaceTwo.

Vsako podvajanje imen v obeh datotekah je dovoljeno, vendar mora biti v vsaki od njiju poljubno ime elementa (spremenljivka, konstanta, objekt, funkcija) unikatno.

V tem primeru je sprememba imena imenskega prostora v klicu funkcije scCheckName() preprečila spremembo spremenljivke $iExt drugega imenskega prostora. Zato je v primeru beseda »spremenjeno« posebej poudarjena - do spremembe dejansko ni prišlo. Vrednost spremenljivke ostane enaka.

Testiranje in večplastna zasnova

Ti preprosti primeri kažejo, da lahko preprosto poenostavite razvoj kompleksnih projektov, povečate učinkovitost, produktivnost in pospešite delo. Vsekakor so se takoj pojavile prve ideje za uporabo imenskih prostorov:

  • varno testiranje skriptov - z zamenjavo "delovnih" prostorov s testnimi analogi;
  • varno oblikovanje s strani velikih skupin razvijalcev - tako, da jim zagotovimo "individualne" prostore za opis elementov.

Pravzaprav je imenski prostor veliko bolj pomemben. Jezik PHP, imenski prostor in vsak element opisa (spremenljivka, konstanta, objekt ...) razvijalcu že dolgo zagotavljajo možnost samostojnega manipuliranja s sintakso in semantiko.

Jezikovne konstrukcije in splošno pravilo sodobnega programiranja: "razumljeno" - izvedeno - obstaja protislovje - "bel zaslon" nima vpliva na profesionalnega razvijalca.

Mnogi programerji sploh ne vedo, kje naj iščejo sporočilo o napaki PHP, ko v brskalniku ni ničesar (prazno belo polje). Programer na določeni stopnji svojega razvoja razmišlja v PHP sintaksi in semantiki, »dela« samodejno in rezultat: lastna sintaksa in lastna semantika, v mejah dovoljenega.

Beli zaslon je takojšnja nedvoumna reakcija profesionalnega programerja in napaka je odpravljena. Zakaj bi izgubljali čas z razhroščevalnikom in pregledovanjem dnevnika napak?

Objekti, nizi in imenski prostori

Lahko bi rekli, da so spremenljivke, konstante in funkcije preteklost, vendar se uporabljajo pri oblikovanju objektov. Dobra koda je, če je algoritem predstavljen z medsebojno delujočimi objekti in ne z zaporedjem pravilnih konstruktov.

Če uporabljate nize predmetov, manipulirate z idejo sklada in zadnjim (prvim) elementom niza, lahko dobite dinamiko: predmeti se sami »odločijo«, kako naj funkcionalnost spletnega mesta deluje glede na trenutno situacijo. .

V PHP je imenski prostor posebna vrsta spremenljivke, ki jo predstavlja lastno unikatno ime, pogosto kompleksno. V kodi je uporabljeno ime imenskega prostora. Če je to niz, lahko med izvajanjem skripta en presledek zamenjate z drugim.

Če PHP uporablja imena imenskih prostorov kot vrednosti spremenljivk, potem je to še bolj semantično obremenjena sintaksa, celo močnejša od nizov objektov.

Predmet je struktura in vsebina, za katero je značilna enotnost. Imenski prostor je niz predmetov, elementov in odnosov med njimi.

Na delujočem sistemu ni mogoče izvajati poskusov, vendar zahvaljujoč imenskemu prostoru PHP omogoča simulacijo pravega delujočega sistema v drugem prostoru za namene:

  • nadaljnji razvoj;
  • testiranje;
  • vzdrževanje itd.

Če abstrahiramo sintakso, ki so jo predlagali razvijalci PHP, in si imenske prostore predstavljamo kot globalne kompleksne sisteme objektov, potem se obzorja možnosti mnogokrat razširijo.

Sintaksa in uporaba imenskega prostora

PHP sprejme besedo imenski prostor samo v prvi vrstici kode vsake datoteke. Vsi opisi morajo le slediti. Sintaksa vključuje samo ime, označeno v običajnem pomenu imena.

Pomembno je, da uporabite pravilne besede, ki izražajo pomen. Bolje je, če je ime dolgo, vendar vsebuje nekaj, kar daje jasno razumevanje, o katerem prostoru govorimo, kaj počne, kaj opisuje, kaj sprejema ali za kaj je ustvarjen.

Presledke lahko gnezdimo neomejeno dolgo, vendar tega ne smemo pretiravati. Ime mora biti jasno, gnezdenje mora biti utemeljeno, zaporedje imen prostorov mora imeti logiko.

V aplikacijah za uporabo in imenski prostor PHP omogoča zapleteno kodiranje, vendar je, kadar koli je to mogoče, bolje izbrati preprosto možnost.

Splošno pravilo je: imenski prostor je opis in to je ena datoteka, uporaba je uvoz prostora v skript uporabe in dodelitev vzdevka (kratke povezave) temu.

Preprost primer samodejnega nalaganja razredov (objektov)

Naloga vsebuje objekt za manipuliranje z nizi, sloge elementov strani (opisi CSS), objekt datuma, objekt datotečnega sistema in objekt baze podatkov. Bistvo implementacije je ustvariti preproste vmesnike za teh pet položajev, da bi lahko uporabljali potrebne zmogljivosti samo z metodami teh objektov.

Neposredna uporaba jezikovnih funkcij in konstruktov ni dovoljena. Ta naloga uporablja samodejno nalaganje razreda PHP. Imenski prostor se obravnava kot zbirka objektov, ki se nahajajo na določeni lokaciji v datotečnem sistemu. Običajno se vsi predmeti nahajajo v datotečnem sistemu glede na njihov pomen, v mapah in datotekah z določenim imenom.

Koda na levi označuje ustvarjanje zahtevanih petih objektov, vendar kje natančno se nahajajo, ni navedeno. Koda na desni prikazuje besedilo samodejnega nalagalnika (glavni skript), ki pri nalaganju razredov (objektov) samodejno nadomesti zahtevano pot do lokacije predmeta in končnico datoteke .php.

Primer več imenskih prostorov

Knjižnica PhpOffice/PhpWord je dober primer uporabe kompleksne hierarhije več imenskih prostorov. Mapa elementov vsebuje skoraj celotno paleto elementov, ki so na voljo pri ustvarjanju dokumenta *.docx (MS Word), druge mape vsebujejo potrebna orodja za delo z elementi, odstavki in tabelami.

Pravzaprav je bila knjižnica postavljena v mapo projekta iz razloga, ker je bilo treba prostor funkcionalnosti PhpOffice / PhpWord dopolniti s posebnimi orodji in na koncu ustvariti lastno različico podobnega izdelka.

Nalaganje številnih razredov različnih imenskih prostorov

Uporaba samodejnega nalaganja imenskega prostora PHP, ko je treba naložiti veliko razredov in je hierarhija razvitega sistema objektov precej zapletena in si jo je težko predstavljati, vodi do potrebe po ustvarjanju togih struktur.

Usmeritev razvijalca (ki produkt uporablja za nadaljevanje dela) je možna le v kontekstu semantike (razumevanje projekta), ki je predstavljena z ustreznimi kombinacijami besed, ki odražajo dejanski pomen in razmerja objektov.

Potreba po uporabi knjižnice v posameznem projektu vodi do rešitve problema, kako združiti imenski prostor razvijalca in avtorja PhpOffice / PhpWord. Najboljši način je, da ta izdelek (njegove prostore in objekte) postavite v lasten prostor projekta.

Pomembno je omeniti, da ne bo mogoče brez spreminjanja imenskih prostorov tega izdelka na ravni njegovih abstraktnih elementov in nalaganja razredov. To kaže, da v imenskem prostoru PHP uporaba notranjih imenskih prostorov morda ni dovolj abstraktna in univerzalna.

Datotečni sistem in lokalizacija prostorov

V bistvu so imenski prostori »oris« poti v datotečnem sistemu do želenega predmeta. Uporaba imen datotek kot imen predmetov je naravna in običajna. Uporaba imen map kot poimenovanje imenskega prostora je objektivna.

"Lesena" organizacija informacij je precej okorna za uporabo in otežuje razvoj, vendar je naravna predstavitev sistemov objektov.

Težava je v tem, da razvojno stopnjo predstavlja poseben urejevalnik kode, ki združuje tako vidno predstavitev map kot vsebino določene mape, ni pa še urejevalnika, ki bi omogočal premikanje od konca do konca skozi objekte in skozi mape.

Problem abstraktnosti in univerzalnosti

Sprejeto z zavestjo razvijalca in ciljem v resnici:

  • zagotavlja abstrakcijo in zmožnost manipulacije informacij v skladu z njihovo resnično semantiko;
  • imenski prostori odražajo položaj skriptov, objektov in deloma pomen projekta v datotečnem sistemu

Pravzaprav lahko s povezovanjem OOP abstrakcije z imeni objektov (datotekami) in njenim prekrivanjem na datotečni sistem (mape) z ustrezno tvorbo imenskega prostora (poti + imena) nadzirate tvorbo imenskih prostorov med izvajanjem skripta.

Programiranje je že dobilo močno dinamiko razvoja, a če prenesemo proces in obremenitev razvojne stopnje iz urejevalnika besedil (v katerem se skripte ustvarjajo in postavljajo v drevesa map) na idejo generiranja kode, ki omogoča, da se izboljša in postavi na pravo mesto v datotečnem sistemu - programiranje se bo povzpelo v nove višave.

Nedavno sem enkapsuliral svoj projekt v imenski prostor in naletel na problem pomanjkanja ustrezne dokumentacije. Vse, kar nam je uspelo najti, datira približno v leto 2009, skoraj pa je 2012 ... V najdenem materialu je veliko nedelujočih mest, ki uporabljajo nekaj, česar ni v trenutni različici php. V zvezi s tem bi rad nekoliko osvetlil to vprašanje.
Torej, kaj je imenski prostor ali imenski prostor? Velika wikipedija jih definira takole:

Imenski prostor je niz, ki pomeni model, abstraktno shranjevanje ali okolje, ustvarjeno za logično združevanje edinstvenih identifikatorjev (to je imen). Identifikator, definiran v imenskem prostoru, je povezan s tem imenskim prostorom. Isti identifikator je lahko neodvisno definiran v več prostorih. Tako ima lahko vrednost, povezana z identifikatorjem, definiranim v enem imenskem prostoru, (ali pa tudi ne) enak (ali drugačen) pomen kot isti identifikator, definiran v drugem imenskem prostoru. Jeziki, ki poznajo imenski prostor, definirajo pravila, ki kažejo, kateremu imenskemu prostoru pripada identifikator (to je njegova definicija).wiki

Vse jasno? Pravzaprav je preprosto. Pred različico 5.3 sta bila v php samo dva prostora - globalni (v katerem se je izvajala vaša glavna koda) in lokalni (v katerem so bile definirane funkcijske spremenljivke).

Od različice 5.3 se je vse spremenilo. Zdaj lahko definirate svoj imenski prostor, v katerem bodo obstajali vaši razredi, metode itd.


Upam, da je postalo malo bolj jasno.

Razrede sem posebej poimenoval enako. Ker sta definirana v različnih prostorih, sta kljub enakim imenom dva različna razreda. Glavna skripta še vedno deluje v globalnem prostoru, tu se ni nič spremenilo in v njej je še vedno mogoče definirati razrede in funkcije. Čemu so potem prostori? Najprej, da zagotovite, da ko vključite datoteko z nekim ogrodjem ali knjižnico, vaši razredi ne bodo preglasili razredov ogrodja ali obratno.

Če želite uporabiti razrede, definirane v vašem imenskem prostoru, morate uvoziti prostor, ki ga definirate v globalni prostor na pravem mestu (običajno raje to storim na začetku datoteke). Za to uporabite ključno besedo use

Pozor: iz neznanega razloga php ne dovoljuje uporabe ključne besede uporaba v stanju blokov in zank

Vzemimo primer iz slik in ga implementiramo v kodo:

Pozor: ključna beseda imenskega prostora mora biti na samem začetku datoteke, takoj za njo
datoteka A.php
B.php datoteko
Možna je alternativna sintaksa:
Priporočljivo je, da vsak imenski prostor deklarirate v ločeni datoteki. Čeprav je mogoče v enem, je strogo odsvetovano!
Zdaj pa preidimo na tretjo datoteko, v kateri bo deloval naš glavni skript
index.php
Zdi se, da je to prednost, dodano je le več kode, vendar to ni povsem res, malo naprej bom dal primer razreda samodejnega nalaganja, s katerim bodo vrstice, ki povezujejo datoteke z razredi, nepotrebne.
Zdaj pa poglejmo naše razrede.

Pozor: z uporabo operatorja ločljivosti obsega (::) v imenskih prostorih php ni dovoljeno! Edina stvar, za katero je primeren, je dostop do metod statičnega razreda in konstant. Sprva so ga želeli uporabiti za imenski prostor, potem pa so se zaradi težav, ki so se pojavile, zanj odločili. Zato konstrukcija, kot je A::A::say(); je neveljaven in bo povzročil napako.

Za imenske prostore morate uporabiti poševnico nazaj "\"
Pozor: Da bi se izognili nesporazumom, je treba ta znak pri uporabi v nizih ubežati: "\\"

Imenski prostori so lahko ugnezdeni eden v drugega, dodajmo naši datoteki A.php:
in v kazalo bomo zapisali naslednje:

Pomembna točka je uporaba vzdevkov za uvožene prostore. Lahko bi napisali A\subA::say(); Strinjate se, da je težko vsakič zapisati polne poti do presledkov, da bi se temu izognili, so uvedli vzdevke. Pri prevajanju se bo zgodilo naslednje: namesto vzdevka sub bo zamenjan A\subA, tako da bomo dobili klic A\subA::say();

Kaj se potem zgodi pri klicanju funkcij, definiranih v globalnem prostoru? PHP najprej poišče funkcijo v prostoru, kjer trenutno delate, in če je ne najde, gre v globalni obseg. Če želite takoj pokazati, da uporabljate globalno funkcijo, morate pred njo postaviti poševnico nazaj.

Da bi se izognili težavam s samodejnim nalaganjem razredov iz prostorov, mora biti datotečni sistem organiziran podobno kot organizacija prostorov. Na primer, imamo korensko mapo classes, kjer bodo shranjeni naši razredi, potem lahko naše prostore organiziramo na naslednji način
razredi\A\A.php
classes\A\sub\A.php (podprostor bo postavljen v ločeno datoteko)
razredi\B\B.php

PHP ima čarobno konstanto __NAMESPACE__, ki vsebuje ime trenutnega prostora.

In zdaj o samodejnem nalaganju.

Spodnji razred ni moj, le poskrbel sem, da deluje in ga malo izboljšal, vzeto od tukaj.
Pozor: Da se lahko vaši razredi naložijo, se mora ime razreda ujemati z imenom datoteke!

".$datoteka." v " .$filepath)); if (file_exists($filepath)) ( if(Autoloader::debug) Autoloader::StPutFile(("connected " .$filepath)); $flag = FALSE; require_once($filepath); break; ) Autoloader:: recursive_autoload($file, $path2, &$flag); ) closeir($handle) zasebna statična funkcija 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"); )
Če pogledate imena razredov, ki se naložijo, boste videli, da je pred vsakim razredom predpona iz imenskega prostora, ki je določen v uporabi. Zato priporočam uporabo lokacije datotek v imenikih, podobnih imenskemu prostoru; to pospeši iskanje na eno ali dve ponovitvi.

Zdaj lahko naš indeks zapišemo takole:
Zdaj se bodo vsi razredi in vmesniki, ki jih boste uporabljali, samodejno naložili.

Da bi prikazali nekatere dinamične zmožnosti jezika s presledki, deklarirajmo še en razred:
test.php

Index.php
sayName("test"); //lahko pa naredite ta test\sayName("test2"); //ali tako $obj::sayName("test"); //lahko pa naredite ta test::sayName("test2");

Upam, da bo moj članek komu koristen.

Zdravo. V današnjem članku si bomo ogledali, kaj so imenski prostori v PHP.

Če ga uporabljate že dlje časa OOP, potem ste verjetno že naleteli na situacijo, ko ste pri povezovanju knjižnice drugega proizvajalca doživeli napako zaradi dejstva, da v kodi že uporabljate ista imena razredov kot v knjižnici. To se lahko zgodi zlasti, če uporabljate običajna imena, kot je "model", "db" in tako naprej. Zdaj vam bom povedal, kako to popraviti.

Imenski prostor- to je neke vrste shramba, ustvarjena za abstraktno združevanje edinstvenih identifikatorjev (imen).

Tisti. če uporabljate imenski prostori, potem lahko varno povežete knjižnice tretjih oseb in se ne bojite, da bodo imele enaka imena kot v vaši kodi. Končajmo s teorijo in preidimo na prakso.

Ustvarimo datoteko mojrazred.php s to vsebino

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

Tukaj smo ustvarili razred v imenskem prostoru moj\oneProjekt. Mimogrede, napisati morate natančno poševnico nazaj. Naj vas ne zmede!

Zdaj v datoteki index.php napišemo naslednje

require_once("myclass.php");
$mc = nov moj razred(); // Napaka: razreda ni bilo mogoče najti
$mc = nov moj\oneProject\MyClass(); // vse deluje
?>

Kot lahko vidite, zdaj ni mogoče ustvariti razreda kar tako, morate določiti, v katerem imenski prostor on leži.

Določimo jih lahko več hkrati imenski prostori v eni datoteki

projekt imenskega prostora;

Const CONNECT_OK = 1;
razred Povezava ( )
funkcija connect() ( )

NamespaceAnotherProject;

Const CONNECT_OK = 1;
razred Povezava ( )
funkcija connect() ( )
?>

Kljub temu, da imamo popolnoma enaka imena razredov, funkcij in konstant, ne bomo imeli konflikta imen, ker ležijo v različnih prostorih.

Uporabimo lahko tudi sintakso oklepajev.

Projekt imenskega prostora (

Const CONNECT_OK = 1;
razred Povezava ( )
funkcija connect() ( )
}

Imenski prostor AnotherProject (

Const CONNECT_OK = 1;
razred Povezava ( )
funkcija connect() ( )
}
?>

Če kodo združite v globalni imenski prostor s kodo v drugih prostorih, potem se uporablja samo sintaksa z oklepaji.

Projekt imenskega prostora (

Const CONNECT_OK = 1;
razred Povezava ( )
funkcija connect() ( )
}

Imenski prostor ( // globalna koda
session_start();
$a = Projekt\poveži();
echo Project\Connection::start();
}
?>

Prav tako ne pozabite, da mora biti definiranje imenskega prostora vedno prva vrstica kode. Če pišete tako, bo prišlo do napake

Če želite ugotoviti, v katerem imenskem prostoru se trenutno nahajate, lahko uporabite konstanto __NAMESPACE__

projekt imenskega prostora;
echo """, __NAMESPACE__, """; // bo natisnil "Projekt"
?>

Z uporabo te konstante lahko na primer dinamično sestavljate imena

projekt imenskega prostora;

Funkcija incl($classname) (
$a = __NAMESPACE__. "\\". $ime razreda;
vrni nov $a;
}
?>

To je torej vse za danes. Več informacij in praktičnih znanj lahko dobite z udeležbo na tečaju