Shembuj të përdorimit të hapësirës së emrave në php. Hapësirat e emrave në PHP, të shpjeguara. Hapësirat e emrave: Fusha të shumta përshkrimi

Kohët e fundit kam përmbledhur projektin tim në një hapësirë ​​emri dhe hasa në problemin e mungesës së dokumentacionit të duhur. Gjithçka që kemi arritur të gjejmë daton afërsisht në vitin 2009, dhe është pothuajse 2012... Në materialin e gjetur, ka shumë vende jo-pune që përdorin diçka që nuk është në versionin aktual të php. Në këtë drejtim, dëshiroj të hedh pak dritë mbi këtë çështje.
Pra, çfarë është hapësira e emrave ose hapësira e emrave? Wikipedia e madhe i përcakton ato si kjo:

Hapësira e emrave është një grup, që do të thotë një model, ruajtje abstrakte ose mjedis i krijuar për grupimin logjik të identifikuesve unikë (domethënë emrat). Një identifikues i përcaktuar në një hapësirë ​​emri shoqërohet me atë hapësirë ​​emri. I njëjti identifikues mund të përcaktohet në mënyrë të pavarur në hapësira të shumta. Kështu, një vlerë e lidhur me një identifikues të përcaktuar në një hapësirë ​​emri mund (ose jo) të ketë të njëjtin kuptim (ose më mirë të ndryshëm) si i njëjti identifikues i përcaktuar në një hapësirë ​​tjetër emri. Gjuhët e ndërgjegjshme për hapësirën e emrave përcaktojnë rregulla që tregojnë se cilës hapësirë ​​emri i përket një identifikues (d.m.th., përkufizimi i tij).wiki

Gjithçka e qartë? Në fakt është e thjeshtë. Përpara versionit 5.3, kishte vetëm dy hapësira në php - globale (në të cilën u ekzekutua kodi juaj kryesor) dhe lokale (në të cilën përcaktoheshin variablat e funksionit).

Që nga versioni 5.3, gjithçka ka ndryshuar. Tani mund të përcaktoni hapësirën tuaj të emrave në të cilën do të ekzistojnë klasat, metodat tuaja, etj.


Shpresoj se u bë pak më e qartë.

Unë i kam emërtuar posaçërisht klasat njësoj. Meqenëse janë të përcaktuara në hapësira të ndryshme, ato janë dy klasa të ndryshme, pavarësisht emrave të njëjtë. Skripti kryesor ende funksionon në hapësirën globale, asgjë nuk ka ndryshuar këtu dhe klasat dhe funksionet ende mund të përcaktohen në të. Pra, për çfarë janë hapësirat atëherë? Para së gjithash, për t'u siguruar që kur përfshini një skedar me ndonjë kornizë ose bibliotekë, klasat tuaja nuk do të anashkalojnë klasat e kornizës ose anasjelltas.

Për të përdorur klasat e përcaktuara në hapësirën tuaj të emrave, duhet të importoni hapësirën që përcaktoni në atë globale në vendin e duhur (zakonisht preferoj ta bëj këtë në fillim të skedarit). Për ta bërë këtë, përdorni fjalën kyçe use

Kujdes: për disa arsye php nuk lejon përdorimin e fjalës kyçe përdorni në blloqe dhe sythe të gjendjes

Le të marrim shembullin nga fotot dhe ta zbatojmë atë në kod:

Kujdes: fjala kyçe e hapësirës së emrave duhet të jetë e vendosur në fillim të skedarit, menjëherë pas
skedari A.php
Skedari B.php
Një sintaksë alternative është e mundur:
Rekomandohet të deklaroni çdo hapësirë ​​emri në një skedar të veçantë. Edhe pse është e mundur në një, nuk rekomandohet rreptësisht!
Tani le të kalojmë te skedari i tretë, në të cilin do të funksionojë skenari ynë kryesor
indeks.php
Duket se ky është një avantazh, vetëm shtohet më shumë kod, por kjo nuk është plotësisht e vërtetë, pak më tej do të jap një shembull të një klase automatike, me të cilën linjat që lidhin skedarët me klasat do të jenë të panevojshme.
Tani le të shohim klasat tona.

Kujdes: duke përdorur operatorin e zgjidhjes së fushës (::) në hapësirat e emrave php nuk lejohet! E vetmja gjë për të cilën është e përshtatshme është qasja në metodat dhe konstantet e klasës statike. Në fillim ata donin ta përdornin për hapësirën e emrave, por më pas vendosën kundër tij për shkak të problemeve që u shfaqën. Prandaj, një ndërtim si A::A::say(); është i pavlefshëm dhe do të rezultojë në një gabim.

Për hapësirat e emrave, duhet të përdorni karakterin "\"
Kujdes: Për të shmangur keqkuptimet, është e nevojshme t'i shpëtoni këtij karakteri kur përdoret në vargje: "\\"

Hapësirat e emrave mund të vendosen brenda njëra-tjetrës, le të shtojmë në skedarin tonë A.php:
dhe në indeks do të shkruajmë sa vijon:

Një pikë e rëndësishme është përdorimi i pseudonimeve për hapësirat e importuara. Mund të shkruani A\subA::say(); Do të pranoni se është e vështirë të shkruash çdo herë shtigjet e plota të hapësirave; për të shmangur këtë, u futën pseudonime. Gjatë kompilimit, do të ndodhë si vijon: në vend të pseudonimit sub, do të zëvendësohet A\subA, kështu që do të marrim thirrjen A\subA::say();

Çfarë ndodh atëherë kur thirrni funksionet e përcaktuara në hapësirën globale? PHP fillimisht kërkon një funksion brenda hapësirës ku jeni duke punuar, dhe nëse nuk e gjen, shkon në shtrirjen globale. Për të treguar menjëherë se jeni duke përdorur një funksion global, duhet t'i paraprini atij me një vijë të prapme.

Për të shmangur problemet me ngarkimin automatik të klasave nga hapësirat, sistemi i skedarëve duhet të organizohet në mënyrë të ngjashme me organizimin e hapësirave. Për shembull, ne kemi një klasa dosjeje rrënjë, ku klasat tona do të ruhen, atëherë hapësirat tona mund të organizohen si më poshtë
klasa\A\A.php
classes\A\sub\A.php (nënhapësira do të vendoset në një skedar të veçantë)
klasa\B\B.php

PHP ka një konstante magjike __NAMESPACE__ e cila përmban emrin e hapësirës aktuale.

Dhe tani në lidhje me ngarkimin automatik.

Klasa më poshtë nuk është e imja, thjesht e bëra të funksionojë dhe e përmirësova pak, marrë nga këtu.
Kujdes: Në mënyrë që klasat tuaja të ngarkohen, emri i klasës duhet të përputhet me emrin e skedarit!

" .$file ." në " .$filepath)); if (file_exists($filepath)) (if(Autoloader::debug) Autoloader::StPutFile(("lidhur " .$filepath)); $flag = FALSE; request_once($filepath); break; ) Autoloader::recursive_autoload($file, $path2, &$flag); ) ) closeir($handle); ) ) funksioni statik privat 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"); )
Nëse shikoni emrat e klasave që vijnë për ngarkim, do të shihni se çdo klasë paraprihet nga një parashtesë nga hapësira e emrave që është specifikuar në përdorim. Kjo është arsyeja pse unë rekomandoj përdorimin e vendndodhjes së skedarëve në drejtori të ngjashme me hapësirën e emrave; kjo përshpejton kërkimin në një ose dy përsëritje.

Tani indeksi ynë mund të shkruhet kështu:
Tani të gjitha klasat dhe ndërfaqet që do të përdorni do të ngarkohen automatikisht.

Për të demonstruar disa nga aftësitë dinamike të gjuhës me hapësira, le të deklarojmë një klasë tjetër:
test.php

Indeksi.php
sayName ("test"); //ose mund ta bëni këtë test\sayName("test2"); //ose si kjo $obj::sayName("test"); //ose mund ta bëni këtë test::sayName("test2");

Shpresoj që artikulli im të jetë i dobishëm për dikë.

PHP, duke filluar me versionin 5.3, na dha hapësira emrash. Që atëherë, ka pasur disa diskutime të ngadalta dhe të nxehta se si të përdoret kjo hapësirë ​​emri?
Disa korniza, si Symphony, Laravel, dhe, natyrisht, Zend, e kanë adoptuar këtë teknologji.
E gjithë kjo pak a shumë përshtatet në skemën MVC. Mbetet një debat, ndoshta i përjetshëm: cili duhet të jetë çifti kryesor i martesës së aplikacionit - Modeli dhe Kontrolluesi?
Disa na thonë se Modelja duhet të jetë e shëndoshë dhe e shëndoshë dhe bashkë me të një kontrolluese e hollë dhe e hollë. Me një fjalë - matriarkati.
Të tjerët, përkundrazi, besojnë se Kontrollori duhet të menaxhojë dhe komandojë gjithçka, kështu që ai rezulton të jetë solid dhe i ushqyer mirë. Dhe me të është një Model i hollë, i hollë, detyra e të cilit zbehet të japë dhe të sjellë. Ky është patriarkalizëm.
Pra, cila është më e mirë në skemën MVC? Patriarkati apo matriarkati?
Le ta shohim këtë nga këndvështrimi i ndërtimit të një njësie familjare të bazuar në demokraci. Dhe le të na ndihmojë Space për këtë.

Ne nuk na pëlqejnë kontrollorët e trashë dhe të ngathët që, si një dem në një dyqan porcelani, mund të shtypin të gjithë aplikacionin nëse jeni të pakujdesshëm.
Nuk na pëlqejnë as modelet e trasha. Epo, kush i pëlqen ata? Ata duhet të jenë të denjë për podium!
Le të përpiqemi, me ndihmën e Hapësirës së emrave, si me një mbles të mirë, të krijojmë një familje harmonike.

Së pari, le të krijojmë skeletin e aplikacionit. Sado banale të jetë, le të jetë një blog.

Ne kemi krijuar një strukturë bazë ku:

  • Blog është ruajtja e aplikacionit tonë;
  • Pamjet dhe shabllonet - ruajtja e pamjeve dhe shablloneve;
  • Utility - depo e bibliotekave të përbashkëta;
  • index.php - skript bootstrap;
  • Post - këtu duhet të zhvillohet idili familjar i Kontrollorit dhe Modelit.

Me index.php gjithçka është e thjeshtë:

run(); /* * fundi i indeksit.php */

Ne përcaktojmë shtigjet e nevojshme dhe krijojmë një ngarkues automatik.
Ngarkuesi automatik ngarkon klasat e kërkuara, të cilat ndodhen në një hierarki dosjesh sipas hapësirës së emrave të klasës. Për shembull, klasa BlogPostServicesView do të kërkohej në Blog/Post/Services.
Dhe këtu është takimi i parë me Hapësirën e Emrave.
Kur nisim index.php, krijojmë një shembull të aplikacionit Blog, klasa e të cilit ngarkohet nga Blog/Blog.php.
Le ta shikojmë atë.

post = postim i ri(); ) funksioni publik run() ( $this->post->view->all(); ) )//end class Blog

Kur krijojmë klasën Blog, ne injektojmë një klasë Post në të me Namespace BlogPost dhe ngarkuesi automatik e ngarkon atë nga Blog/Post/Post.php.
Ndoshta kjo klasë mund të quhet Controller,

pamje = Pamje e re(); ) )//mbarimi i klasës Post

Subjekti i Postës përfshin:
- vetë struktura e regjistrimit të të dhënave - BlogPostEntitiesPostEntity.php

Shërbimet që shërbejnë kërkesat e Kontrolluesit - BlogPostServicesView.php (një nga shërbimet, për shembull)

db = new DB(); )//fund __ndërtimi i funksionit publik all() ( $posts = $this->db->survey(); Mendoni::compose(array("header" => "header", "main" => "main", "footer" => "footer",), array ("posts" => $posts, "title" => "faqe Viper",)); ) )//mbarimi i klasës PostView

Sistemi i ndërveprimit të bazës së të dhënave - BlogPostRepositoriesDB.php - ja ku është, Modeli ynë i hollë dhe elegant,
Thjesht jepni, sillni dhe asgjë më shumë!

dbh = PDO e re ("mysql:host=localhost;dbname=test", $user, $pass, grup (PDO::ATTR_PERSISTENT => e vërtetë)); ) catch (PDOException $e) (echo "Gabim!: " . $e->getMessage() ."
"; die(); ) )//end __ndërtoj anketën e funksionit publik() ( $query_view = $this->dbh->prepare("SELECT * from posts"); $query_view->execute(); kthe $query_view- >fetchAll(PDO::FETCH_CLASS, "BlogPostEntitiesPostEntity"); )//fund sondazhi )//mbarimi i klasës Db

Si rezultat, ne mundëm të krijonim një strukturë aplikacioni ku të gjithë komponentët janë të lidhur mirë, ndërsa arritëm një ndarje të qartë të klasave, ku secila klasë kryen detyrën e saj. Kontrolluesi ynë është i hollë dhe në të njëjtën kohë i fuqishëm. Modelja përputhet me të. Familje perfekte!
Dhe e gjitha falë Hapësirës së Emrave.

Unë nuk debatoj, në shumë raste korniza është e përshtatshme. Por shikoni, hapësira e emrave nuk ju kujton asgjë?
Një ndarje e qartë në klasa, një hierarki strikte dhe në të njëjtën kohë fleksibël drejtorish dhe klasash, plotësisht në varësi të zhvilluesit.
Ndonjëherë nuk ka një shtesë kaq të rëndësishme në formën e qindra skedarëve dhe klasave në formën e një kornize.
Mungesa e një shtrati Prokrustean të rregullave për ndërveprimin e klasave dhe komponentëve.

Artikulli u frymëzua nga mendimet mbi këtë temë nga Taylor Otwell, autori i kornizës Laravel, për të cilin shumë faleminderit për të.
Adresa e shembullit të kodit burimor në GitHub.

Përshëndetje. Në artikullin e sotëm do të shikojmë, çfarë janë hapësirat e emrave në PHP.

Nëse e keni përdorur për një kohë të gjatë OOP, atëherë ndoshta keni hasur në një situatë ku, kur lidhni një bibliotekë të palëve të treta, keni përjetuar një dështim për shkak të faktit se po përdorni tashmë të njëjtat emra klasash në kodin tuaj si në bibliotekë. Kjo mund të ndodhë veçanërisht nëse përdorni emra të zakonshëm si "model", "db" e kështu me radhë. Unë do t'ju tregoj tani se si ta rregulloni këtë.

Hapësira e emrave- ky është një lloj ruajtjeje i krijuar për grupimin abstrakt të identifikuesve (emrave) unikë.

Ato. nëse përdorni hapësirat e emrave, atëherë mund të lidhni me siguri bibliotekat e palëve të treta dhe të mos keni frikë se ato do të kenë të njëjtët emra si në kodin tuaj. Le të përfundojmë me teorinë dhe le të kalojmë në praktikë.

Le të krijojmë një skedar myclass.php me këtë përmbajtje

hapësira e emrit my\oneProject;
klasa MyClass ( )
?>

Këtu kemi krijuar një klasë në hapësirën e emrave Projekti im\one. Nga rruga, duhet të shkruani saktësisht vijën e prapme. Mos u ngatërroni!

Tani në dosje indeks.php le të shkruajmë sa vijon

request_once ("myclass.php");
$mc = Klasa e re My(); // Gabim: klasa nuk u gjet
$mc = i ri my\oneProject\MyClass(); // gjithçka funksionon
?>

Siç mund ta shihni, tani nuk është e mundur të krijoni një klasë ashtu si ajo, duhet të specifikoni se në cilën hapësira e emrit ai është shtrirë.

Mund të specifikojmë disa në të njëjtën kohë hapësirat e emrave në një skedar

Projekti i hapësirës së emrave;

Const CONNECT_OK = 1;
Lidhja e klasës ( )
funksioni lidh () ( )

Hapësira e emraveNjë projekt tjetër;

Const CONNECT_OK = 1;
Lidhja e klasës ( )
funksioni lidh () ( )
?>

Pavarësisht se kemi emra absolutisht identikë të klasave, funksioneve dhe konstanteve, nuk do të kemi konflikt emri, sepse shtrihen në hapësira të ndryshme.

Mund të përdorim gjithashtu sintaksë të kllapave.

Projekti i hapësirës së emrit (

Const CONNECT_OK = 1;
Lidhja e klasës ( )
funksioni lidh () ( )
}

Hapësira e emrave AnotherProject (

Const CONNECT_OK = 1;
Lidhja e klasës ( )
funksioni lidh () ( )
}
?>

Nëse kombinoni kodin në hapësira globale e emrave me kod në hapësira të tjera, atëherë përdoret vetëm sintaksa me kllapa.

Projekti i hapësirës së emrit (

Const CONNECT_OK = 1;
Lidhja e klasës ( )
funksioni lidh () ( )
}

Hapësira e emrave ( // kodi global
sesioni_fillimi ();
$a = Projekti\lidhe();
echo Project\Connection::start();
}
?>

Gjithashtu, mos harroni se përcaktimi i hapësirës së emrave duhet të jetë gjithmonë rreshti i parë i kodit. Nëse shkruani kështu, do të ketë një gabim

Për të zbuluar se në cilën hapësirë ​​emri jeni aktualisht, mund të përdorni konstanten __NAMESPACE__

Projekti i hapësirës së emrave;
jehonë """, __NAMESPACE__, """; // do të printojë "Project"
?>

Duke përdorur këtë konstante, për shembull, mund të ndërtoni në mënyrë dinamike emra

Projekti i hapësirës së emrave;

Funksioni përfshirë ($classname) (
$a = __NAMESPACE__ . "\\" . $emri i klasës;
ktheje $a të reja;
}
?>

Pra, kjo është e gjitha për sot. Ju mund të merrni më shumë informacion dhe njohuri praktike duke ndjekur kursin

Kohët e fundit kam përmbledhur projektin tim në një hapësirë ​​emri dhe hasa në problemin e mungesës së dokumentacionit të duhur. Gjithçka që kemi arritur të gjejmë daton afërsisht në vitin 2009, dhe është pothuajse 2012... Në materialin e gjetur, ka shumë vende jo-pune që përdorin diçka që nuk është në versionin aktual të php. Në këtë drejtim, dëshiroj të hedh pak dritë mbi këtë çështje.
Pra, çfarë është hapësira e emrave ose hapësira e emrave? Wikipedia e madhe i përcakton ato si kjo:

Hapësira e emrave është një grup, që do të thotë një model, ruajtje abstrakte ose mjedis i krijuar për grupimin logjik të identifikuesve unikë (domethënë emrat). Një identifikues i përcaktuar në një hapësirë ​​emri shoqërohet me atë hapësirë ​​emri. I njëjti identifikues mund të përcaktohet në mënyrë të pavarur në hapësira të shumta. Kështu, një vlerë e lidhur me një identifikues të përcaktuar në një hapësirë ​​emri mund (ose jo) të ketë të njëjtin kuptim (ose më mirë të ndryshëm) si i njëjti identifikues i përcaktuar në një hapësirë ​​tjetër emri. Gjuhët e ndërgjegjshme për hapësirën e emrave përcaktojnë rregulla që tregojnë se cilës hapësirë ​​emri i përket një identifikues (d.m.th., përkufizimi i tij).wiki

Gjithçka e qartë? Në fakt është e thjeshtë. Përpara versionit 5.3, kishte vetëm dy hapësira në php - globale (në të cilën u ekzekutua kodi juaj kryesor) dhe lokale (në të cilën përcaktoheshin variablat e funksionit).

Që nga versioni 5.3, gjithçka ka ndryshuar. Tani mund të përcaktoni hapësirën tuaj të emrave në të cilën do të ekzistojnë klasat, metodat tuaja, etj.


Shpresoj se u bë pak më e qartë.

Unë i kam emërtuar posaçërisht klasat njësoj. Meqenëse janë të përcaktuara në hapësira të ndryshme, ato janë dy klasa të ndryshme, pavarësisht emrave të njëjtë. Skripti kryesor ende funksionon në hapësirën globale, asgjë nuk ka ndryshuar këtu dhe klasat dhe funksionet ende mund të përcaktohen në të. Pra, për çfarë janë hapësirat atëherë? Para së gjithash, për t'u siguruar që kur përfshini një skedar me ndonjë kornizë ose bibliotekë, klasat tuaja nuk do të anashkalojnë klasat e kornizës ose anasjelltas.

Për të përdorur klasat e përcaktuara në hapësirën tuaj të emrave, duhet të importoni hapësirën që përcaktoni në atë globale në vendin e duhur (zakonisht preferoj ta bëj këtë në fillim të skedarit). Për ta bërë këtë, përdorni fjalën kyçe use

Kujdes: për disa arsye php nuk lejon përdorimin e fjalës kyçe përdorni në blloqe dhe sythe të gjendjes

Le të marrim shembullin nga fotot dhe ta zbatojmë atë në kod:

Kujdes: fjala kyçe e hapësirës së emrave duhet të jetë e vendosur në fillim të skedarit, menjëherë pas
skedari A.php
Skedari B.php
Një sintaksë alternative është e mundur:
Rekomandohet të deklaroni çdo hapësirë ​​emri në një skedar të veçantë. Edhe pse është e mundur në një, nuk rekomandohet rreptësisht!
Tani le të kalojmë te skedari i tretë, në të cilin do të funksionojë skenari ynë kryesor
indeks.php
Duket se ky është një avantazh, vetëm shtohet më shumë kod, por kjo nuk është plotësisht e vërtetë, pak më tej do të jap një shembull të një klase automatike, me të cilën linjat që lidhin skedarët me klasat do të jenë të panevojshme.
Tani le të shohim klasat tona.

Kujdes: duke përdorur operatorin e zgjidhjes së fushës (::) në hapësirat e emrave php nuk lejohet! E vetmja gjë për të cilën është e përshtatshme është qasja në metodat dhe konstantet e klasës statike. Në fillim ata donin ta përdornin për hapësirën e emrave, por më pas vendosën kundër tij për shkak të problemeve që u shfaqën. Prandaj, një ndërtim si A::A::say(); është i pavlefshëm dhe do të rezultojë në një gabim.

Për hapësirat e emrave, duhet të përdorni karakterin "\"
Kujdes: Për të shmangur keqkuptimet, është e nevojshme t'i shpëtoni këtij karakteri kur përdoret në vargje: "\\"

Hapësirat e emrave mund të vendosen brenda njëra-tjetrës, le të shtojmë në skedarin tonë A.php:
dhe në indeks do të shkruajmë sa vijon:

Një pikë e rëndësishme është përdorimi i pseudonimeve për hapësirat e importuara. Mund të shkruani A\subA::say(); Do të pranoni se është e vështirë të shkruash çdo herë shtigjet e plota të hapësirave; për të shmangur këtë, u futën pseudonime. Gjatë kompilimit, do të ndodhë si vijon: në vend të pseudonimit sub, do të zëvendësohet A\subA, kështu që do të marrim thirrjen A\subA::say();

Çfarë ndodh atëherë kur thirrni funksionet e përcaktuara në hapësirën globale? PHP fillimisht kërkon një funksion brenda hapësirës ku jeni duke punuar, dhe nëse nuk e gjen, shkon në shtrirjen globale. Për të treguar menjëherë se jeni duke përdorur një funksion global, duhet t'i paraprini atij me një vijë të prapme.

Për të shmangur problemet me ngarkimin automatik të klasave nga hapësirat, sistemi i skedarëve duhet të organizohet në mënyrë të ngjashme me organizimin e hapësirave. Për shembull, ne kemi një klasa dosjeje rrënjë, ku klasat tona do të ruhen, atëherë hapësirat tona mund të organizohen si më poshtë
klasa\A\A.php
classes\A\sub\A.php (nënhapësira do të vendoset në një skedar të veçantë)
klasa\B\B.php

PHP ka një konstante magjike __NAMESPACE__ e cila përmban emrin e hapësirës aktuale.

Dhe tani në lidhje me ngarkimin automatik.

Klasa më poshtë nuk është e imja, thjesht e bëra të funksionojë dhe e përmirësova pak, marrë nga këtu.
Kujdes: Në mënyrë që klasat tuaja të ngarkohen, emri i klasës duhet të përputhet me emrin e skedarit!

" .$file ." në " .$filepath)); if (file_exists($filepath)) (if(Autoloader::debug) Autoloader::StPutFile(("lidhur " .$filepath)); $flag = FALSE; request_once($filepath); break; ) Autoloader::recursive_autoload($file, $path2, &$flag); ) ) closeir($handle); ) ) funksioni statik privat 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"); )
Nëse shikoni emrat e klasave që vijnë për ngarkim, do të shihni se çdo klasë paraprihet nga një parashtesë nga hapësira e emrave që është specifikuar në përdorim. Kjo është arsyeja pse unë rekomandoj përdorimin e vendndodhjes së skedarëve në drejtori të ngjashme me hapësirën e emrave; kjo përshpejton kërkimin në një ose dy përsëritje.

Tani indeksi ynë mund të shkruhet kështu:
Tani të gjitha klasat dhe ndërfaqet që do të përdorni do të ngarkohen automatikisht.

Për të demonstruar disa nga aftësitë dinamike të gjuhës me hapësira, le të deklarojmë një klasë tjetër:
test.php

Indeksi.php
sayName ("test"); //ose mund ta bëni këtë test\sayName("test2"); //ose si kjo $obj::sayName("test"); //ose mund ta bëni këtë test::sayName("test2");

Shpresoj që artikulli im të jetë i dobishëm për dikë.

(PHP 5 >= 5.3.0, PHP 7)

Përpara se të diskutoni përdorimin e hapësirave të emrave, është e rëndësishme të kuptoni se si PHP e di se cilin element të hapësirës së emrave po kërkon kodi juaj. Një analogji e thjeshtë mund të bëhet midis hapësirave të emrave PHP dhe një sistemi skedarësh. Ekzistojnë tre mënyra për të hyrë në një skedar në një sistem skedar:

  1. Emri relativ i skedarit si foo.txt. Kjo zgjidhet për të direktoria aktuale/foo.txt ku direktoria aktuale është drejtoria e zënë aktualisht. Pra, nëse drejtoria aktuale është /shtëpi/foo, emri vendos të /home/foo/foo.txt.
  2. Emri relativ i rrugës si nëndrejtori/foo.txt. Kjo zgjidhet për të direktoria aktuale/nëndirektoria/foo.txt.
  3. Emri absolut i rrugës si /main/foo.txt. Kjo zgjidhet për të /main/foo.txt.
I njëjti parim mund të zbatohet për elementët me hapësirë ​​emri në PHP. Për shembull, emri i klasës mund të referohet në tre mënyra:
  1. Emër i pakualifikuar, ose një emër klase pa parashtesë si $a = foo e re(); ose foo::metoda statike(); hapësira aktuale e emrave, kjo zgjidhet të emri aktual\foo foo. Një paralajmërim: emrat e pakualifikuar për funksionet dhe konstantat do të zgjidhen në funksione dhe konstante globale nëse funksioni ose konstanta e hapësirës së emrave nuk është përcaktuar. Shihni Përdorimi i hapësirave të emrave: kthim në funksion/konstante globale për detaje.
  2. Emri i kualifikuar, ose një emër klase me parashtesë si $a = hapësira e re e nënemrave\foo(); ose subnamespace\foo::staticmethod();. Nëse hapësira e emrit aktual është hapësira aktuale e emrave, kjo zgjidhet të aktualnamespace\subnamespace\foo. Nëse kodi është kod global, pa hapësirë ​​emri, kjo zgjidhet në hapësira e nënemrave\foo.
  3. Emër plotësisht i kualifikuar, ose një emër me parashtesë me operatorin e prefiksit global si $a = new \currentnamespace\foo(); ose \currentnamespace\foo::staticmethod();. Kjo gjithmonë zgjidhet në emrin e drejtpërdrejtë të specifikuar në kod, emri aktual\foo.

Këtu është një shembull i tre llojeve të sintaksës në kodin aktual:

hapësira e emrave Foo\Bar\subnamespace;

const FOO = 1;
funksioni foo()()
klasë foo
{
}
?>

hapësira e emrit Foo\Bar;
përfshini "file1.php";

konst FOO = 2;
funksioni foo()()
klasë foo
{
funksioni statik metoda statike()()
}

/* Emër i pakualifikuar */
foo (); foo::metoda statike(); jehonë FOO ;

/* Emri i kualifikuar */
hapësira e nënemrave\foo(); // vendos të funksionojë Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // zgjidh në klasën Foo\Bar\subnamespace\foo,
// metodë statike
echo subemspace\FOO; // zgjidh në Foo\Bar\subnamespace\FOO konstante

/* Emri plotësisht i kualifikuar */
\foo\bar\foo(); // vendos të funksionojë Foo\Bar\foo
\foo\bar\foo::metoda statike(); // zgjidh në klasën Foo\Bar\foo, metodë statike
echo\Foo\Bar\FOO; // zgjidh në konstante Foo\Bar\FOO
?>

Vini re se për të hyrë në çdo klasë, funksion ose konstante globale, mund të përdoret një emër plotësisht i kualifikuar, si p.sh \strlen() ose \Përjashtim ose \INI_ALL. ?>