Shembuj të përdorimit të hapësirës së emrave në php. Hapësirat e emrave në PHP, të shpjeguara. Hapësira globale e emrave


  • Përkthimi
  • Tutorial
Shënim për.: Jam i vetëdijshëm që në momentin e përkthimit versioni aktual i PHP-së është 5.5, dhe gjithashtu se ekziston një libër manual i mençur. Por më dukej interesante se si autori paraqet funksionalitetin e hapësirës së emrave. Ndoshta artikulli do t'i ndihmojë disa nga ata që sapo po mësojnë bazat (dhe jo vetëm të tjerët, ka shumë zhvillues me mjekër që janë vendosur në PHP 5.2). Hodor.

Në PHP, duke filluar nga versioni 5.3, u shfaqën hapësirat e emrave. Shumica e gjuhëve moderne e kanë pasur prej kohësh këtë funksionalitet, por PHP ishte pak vonë. Megjithatë, çdo veçori e re ka qëllimin e vet, le të zbulojmë se si mund të përfitojmë duke përdorur hapësirën e emrave.

Në PHP nuk mund të keni dy klasa të emërtuara njësoj, të gjitha duhet të jenë unike. Problemi me këtë kufizim është se nëse përdorni bibliotekën e palës së tretë të dikujt tjetër që ofron një klasë të quajtur Përdorues, atëherë nuk mund të krijoni klasën tuaj të quajtur gjithashtu Përdorues. Kjo është vërtet e keqe, sepse User është një emër shumë i përshtatshëm për një klasë, apo jo?

Hapësirat e emrave na lejojnë të kapërcejmë këtë problem dhe ne mund të krijojmë aq klasa përdoruesish sa na nevojiten Hapësirat e emrave na lejojnë gjithashtu të organizojmë kodin tonë në paketa të përshtatshme, si dhe të tregojmë pronësinë tonë mbi atë kod.

Le të hedhim një vështrim në një klasë shumë të zakonshme. Po... E di që i keni përdorur tashmë, çfarë lidhje kanë hapësirat e emrave me të? Vetëm më beso për këtë, mirë?

Hapësira globale e emrave

Këtu është një klasë shumë e thjeshtë:
Asgjë e veçantë siç mund të shihni, dhe nëse dëshironi ta përdorni, thjesht bëni këtë:
Dale, disi di PHP...

Mirë, mirë, më fal. Çështja është se ne mund të mendojmë për këtë klasë si në hapësirën globale të emrave. Në fakt, kjo do të thotë që klasa nuk i përket asnjë pakete, vetëm një klase të zakonshme.

Përdorimi i lehtë i hapësirave të emrave

Le të krijojmë një Eddard tjetër, pranë atij global.
Këtu kemi një klasë shumë të ngjashme me një ndryshim të vogël, shtimin e një direktive të hapësirës së emrave. Hapësira e emrave të vargut Stark; i thotë PHP se ne jemi duke punuar në hapësirën e emrave Stark dhe çdo kod (duke deklaruar klasa, funksione, variabla, etj.) do t'i referohet asaj.

Pra, ne duhet të krijojmë një Edd të ri, nëse vendosni që duhet të bëhet kështu:
Pra jo, kjo nuk është e vërtetë. Këtu marrim një shembull të klasës nga shembulli i parë që krijuam më parë. Jo ai në hapësirën e emrave Stark. Le të përpiqemi të krijojmë një shembull të Eddard Stark.
Për të krijuar një shembull të një klase, ne duhet të parashtesim emrin e klasës me një parashtesë nga hapësira e emrave të cilës i përket klasa dhe ta përdorim si kufitar kthesë e prapme. Si rezultat, ne kemi një shembull të klasës që na nevojitet. A nuk është magjike?

Nga rruga, hapësirat e emrave mund të formojnë një hierarki komplekse arbitrare, duke përdorur aq nivele sa të nevojiten. Për shembull:
Kjo\Hapësira e emrave\Dhe\Klasa\Kombinimi\Është\Silly\Por\Funksionon

Teoria e relativitetit

Mbani mend se si ju thashë se PHP funksionon gjithmonë në lidhje me hapësirën aktuale të emrave. Le ta shohim këtë në veprim:
Duke shtuar një direktivë të hapësirës së emrave, ne i bëjmë të ditur PHP se jemi në hapësirën e emrave Stark. Meqenëse është në të që ne përcaktuam klasën Eddard, kjo është pikërisht ajo që do të marrim. Shih - gjithçka është relative.

Tani që kemi ndryshuar hapësirën e emrave, kemi një problem të vogël. A keni ndonjë ide për çfarë po flas? Tani si mund ta marrim klasën tonë origjinale Eddard? Epo, ai në hapësirën globale?

Për fat të mirë, PHP ka një truk që na lejon të zgjidhim këtë problem - thjesht duke shtuar \ në emrin e klasës.
Duke parë vijën kryesore, PHP kupton se ne duhet të shikojmë përtej hapësirës aktuale të emrave dhe krijon një shembull të klasës që na nevojitet.

Tani përdorni imagjinatën tuaj. Imagjinoni që kemi një klasë nga një hapësirë ​​tjetër emri të quajtur Tully\Edmure. Tani duhet ta përdorim atë brenda hapësirës Stark. Dhe si ta bëjmë këtë?

Edhe një herë, na u desh të përdornim një vijë të kundërt për t'u bërë globale përpara se të fillonim klasën në hapësirën Tully.

Në përgjithësi, referimi ndaj klasave nga hapësira të tjera emrash si kjo, përdorimi i hierarkisë së plotë në emër, mund të jetë mjaft i lodhshëm. Por për fat të mirë, ekziston një mundësi për të bërë një shkurtore, le të hedhim një vështrim:

Duke përdorur direktivën e përdorimit, mund të marrim një klasë nga një hapësirë ​​tjetër emri. Ju lutem, mos më pyesni "pse nuk kemi vënë një prerje kryesore këtu, sepse unë thjesht nuk e di?" Me sa di unë, ky është i vetmi përjashtim. Jo, këtu mund të përdorni një prerje përpara. por kjo nuk do të ketë kuptim.

Oh, edhe një truk i vogël! Ne mund t'u japim klasave tona të importuara pseudonimet:
Duke përdorur fjalën kyçe as, ne i kemi dhënë klasës Tully/Brynden pseudonimin Blackfish, i cili na lejon të përdorim pseudonimin e ri për ta identifikuar atë në hapësirën aktuale të emrave. I zgjuar, apo jo? Kjo është gjithashtu shumë e përshtatshme nëse duhet të përdorni dy klasa të quajtura të njëjta brenda të njëjtës hapësirë ​​emri:

Duke i dhënë Daenerys nga hapësira Dothraki pseudonimin Khaleesi, ne mund të përdorim të dy klasat e Daenerys. Mjaft i përshtatshëm, atje mund të përdorim të gjitha klasat e nevojshme në aplikacionin tonë.

Struktura

Hapësirat e emrave mund të na ndihmojnë gjithashtu të organizojmë kodin tonë. Më lejoni të demonstroj.

Le të themi se dua të krijoj një bibliotekë me burim të hapur. Do të më pëlqente nëse të tjerët mund të përdornin kodin tim, do të ishte mirë! Problemi është se emrat e klasave në kodin tim bien ndesh me aplikacionin e vetë përdoruesit të bibliotekës sime. Do të ishte tmerrësisht e papërshtatshme. Kështu do ta zgjidhja këtë problem:
Dayle\Blog\Content\Post Dayle\Blog\Content\Page Dayle\Blog\Etiketë
Këtu kam përdorur emrin tim për të treguar se kodi është i imi dhe për të ndarë kodin tim nga kodi i përdoruesit të bibliotekës sime. Brenda hapësirës së emrave bazë krijova një strukturë klase sipas hierarkisë së tyre.

Pasi të filloni të përdorni kompozitorin, do të mësoni se si të përdorni hapësirat e emrave për ta bërë më të lehtë ngarkimin automatik të kodit. Unë rekomandoj që t'i hidhni një sy këtij mekanizmi të dobishëm.

Të metat

T'ju them të drejtën, ndihem pak në faj që e quajta këtë nëntitull "Disavantazhe". Ajo për të cilën do të flas nuk është në fakt një gabim.

Fakti është se në gjuhët e tjera funksionaliteti i hapësirave të emrave zbatohet në mënyrë të ngjashme, dhe në të njëjtën kohë gjuhët ofrojnë funksionalitet shtesë për ndërveprim me hapësirat e emrave.

Në Java, për shembull, mund të importoni disa klasa në hapësirën aktuale të emrave duke përdorur deklaratën import. Në Java, importi është analog për t'u përdorur dhe përdor pika për të ndarë hapësirat e mbivendosura të emrave (ose paketat). Ja një shembull:
importo dayle.blog.*;
Kjo do të importojë të gjitha klasat në paketën 'dayle.blog'.

Ju nuk mund ta bëni këtë në PHP. Ju duhet të importoni secilën klasë veç e veç. Na vjen keq. Në fakt, pse po kërkoj falje? Shkoni përpara dhe ankohuni te ekipi i zhvillimit të PHP, por ju kërkoj të jeni të sjellshëm. Ata kanë bërë shumë gjëra interesante kohët e fundit.

Ja një truk i zoti për ta zbutur pak problemin. Imagjinoni që kemi strukturën e klasës nga shembulli i mëparshëm. Mund të marrim një pjesë të nënhapësirës dhe t'i japim një pseudonim.
Kjo mund të jetë e dobishme kur përdorni një numër të madh klasash. Mirë për të gjithë!

Me kënaqësi do t'i pranoj të gjitha dëshirat dhe sugjerimet në një mesazh personal, faleminderit.

Një variabël përcakton një vlerë, por mund të jetë një referencë për një ndryshore tjetër dhe të ketë vlerën e saj. Gjatë ekzekutimit të një algoritmi, një ndryshore zakonisht merr shumë vlera të ndryshme. Një konstante ruan vetëm një vlerë. Një objekt është i paparashikueshëm: ka tendencë të ketë strukturë, përmbajtje dhe shumë veçori.

Hapësira e emrave është një koleksion variablash, konstantesh, objektesh, funksionesh dhe konstruktesh të tjera të krijuara nga zhvilluesi që mund të referohen përmes emrit të kësaj hapësire emri.

Emrat: sfera e përshkrimit të të dhënave dhe algoritmeve

Emrat e elementeve (ndryshore, konstante, objekte, funksione dhe konstruksione të tjera zhvilluesish) nuk kryqëzohen kurrë. PHP interpreton çdo përputhje emri si një gabim serioz, dhe në rastet kur nuk mund ta identifikojë qartë problemin, zhvilluesi merr kodin që nuk funksionon siç synohet, ose një kuti të bardhë në shfletues.

Të gjithë emrat e të gjitha të dhënave duhet të jenë unikë sepse hapësira është globale. Emrat e objekteve dhe funksioneve gjithashtu nuk duhet të përsëriten, por fushëveprimi i dukshmërisë globale ndërpritet në trupat e metodës së objekteve dhe funksioneve. Ai ka hapësirën e vet lokale të emrave dhe asgjë nuk ju pengon të emërtoni diçka nga brenda në të njëjtën mënyrë siç është caktuar nga jashtë.

Shembulli i mësipërm është një klasik, nëse nuk i kushtoni vëmendje fjalës kyçe të hapësirës së emrit: gjithçka është si gjithmonë. E dyta përfshin vepra. Prefiksi NameSpaceTwo\ përpara emrave të funksionit specifikon se nga cili insert është marrë kodi.

Nëse heqim fjalën kyçe globale dhe operacionin nga funksioni i parë $iExt = 1; lëvizni në rreshtin e mësipërm, atëherë as funksioni i parë dhe as i dyti nuk do të dinë për vlerën e ndryshores 100.

Hapësirat e emrave: Fusha të shumta përshkrimi

Shembulli i treguar ka një skedar të përbashkët që përdor dy inserte. Çdo insert ka të njëjtin funksion scCheckName(). Cilin të zgjedhë vendoset nga programuesi duke përdorur emrin e hapësirës që është relevante në kohën e duhur në vendin e duhur në kod.

Fakti që i njëjti emër është i pranishëm në kodin e zakonshëm (pas bashkimit të inserteve) nuk shkakton gabim për arsyen e thjeshtë se çdo skedar insert shënohet me emrin e tij unik.

Në skedarin e parë, gjithçka që do të përshkruhet në të shoqërohet me emrin NameSpaceOne. Në skedarin e dytë, të gjitha përshkrimet do të shoqërohen me emrin NameSpaceTwo.

Lejohet çdo dyfishim i emrave në të dy skedarët, por në secilin prej tyre çdo emër elementi (ndryshore, konstante, objekt, funksion) duhet të jetë unik.

Në këtë shembull, ndryshimi i emrit të hapësirës së emrave në thirrjen e funksionit scCheckName() parandaloi ndryshimin e ndryshores $iExt të hapësirës së dytë të emrave. Kjo është arsyeja pse në shembull fjala "ndryshuar" theksohet posaçërisht - ndryshimi në të vërtetë nuk ndodhi. Vlera e ndryshores mbetet e njëjtë.

Testimi dhe dizajni i shumëfishtë

Këta shembuj të thjeshtë tregojnë se ju lehtë mund të thjeshtoni zhvillimin e projekteve komplekse, të rrisni efikasitetin, produktivitetin dhe të shpejtoni punën. Padyshim, idetë e para për përdorimin e hapësirave të emrave u shfaqën menjëherë:

  • testimi i sigurt i skripteve - duke zëvendësuar hapësirat "pune" me analoge testimi;
  • dizajn i sigurt nga ekipe të mëdha zhvilluesish - duke u ofruar atyre hapësira "individuale" për përshkrimin e elementeve.

Në fakt, hapësira e emrit është shumë më e rëndësishme. Gjuha PHP, hapësira e emrave dhe çdo element i përshkrimit (ndryshues, konstant, objekt...) i kanë ofruar prej kohësh zhvilluesit mundësinë për të manipuluar në mënyrë të pavarur sintaksën dhe semantikën.

Ndërtimet gjuhësore dhe rregulli i përgjithshëm i programimit modern: "kuptohet" - ekzekutohet - ka një kontradiktë - "ekrani i bardhë" nuk ka asnjë efekt tek një zhvillues profesionist.

Shumë programues as nuk dinë se ku të kërkojnë një mesazh gabimi PHP kur nuk ka asgjë në shfletues (një kuti e bardhë bosh). Në një fazë të caktuar të zhvillimit të tij, një programues mendon në sintaksën dhe semantikën PHP, "punon" automatikisht dhe rezultati: sintaksa e tij dhe semantika e tij, brenda kufijve të asaj që lejohet.

Një ekran i bardhë është një reagim i menjëhershëm i qartë nga një programues profesionist dhe gabimi eliminohet. Pse të humbni kohë në një korrigjues dhe duke parë regjistrin e gabimeve?

Objektet, vargjet dhe hapësirat e emrave

Mund të thuash që variablat, konstantet dhe funksionet janë një gjë e së kaluarës, por ato përdoren në dizajnimin e objekteve. Kodi i mirë është kur algoritmi përfaqësohet nga objekte që ndërveprojnë, dhe jo nga një sekuencë konstruksionesh të sakta.

Nëse përdorni grupe objektesh, manipuloni idenë e një pirg dhe elementin e fundit (të parë) të grupit, mund të merrni dinamikën: vetë objektet "vendosin" se si duhet të funksionojë funksionaliteti i faqes në varësi të situatës aktuale. .

Në PHP, hapësira e emrit është një lloj i veçantë variabli, i përfaqësuar nga emri i tij unik, shpesh kompleks. Emri i hapësirës së emrave përdoret në kod. Nëse ky është një varg, atëherë mund të zëvendësoni një hapësirë ​​me një tjetër gjatë ekzekutimit të skriptit.

Nëse PHP përdor emrat e hapësirave të emrave si vlera të ndryshueshme, atëherë kjo është një sintaksë edhe më e ngarkuar semantikisht, edhe më e fortë se grupet e objekteve.

Një objekt është një strukturë dhe përmbajtje që karakterizohen nga uniteti. Hapësira e emrave është një grup objektesh, elementesh dhe marrëdhëniesh ndërmjet tyre.

Nuk është e mundur të kryhen eksperimente në një sistem që funksionon, por falë hapësirës së emrave, PHP ofron mundësinë për të simuluar një sistem të vërtetë ekzekutues në një hapësirë ​​të ndryshme për qëllimet e:

  • zhvillimi i mëtejshëm;
  • duke testuar;
  • mirëmbajtje etj.

Nëse abstragojmë nga sintaksa e propozuar nga zhvilluesit e PHP dhe imagjinojmë hapësirat e emrave si sisteme komplekse globale të objekteve, atëherë horizontet e mundësive zgjerohen shumë herë.

Sintaksa dhe përdorimi i hapësirës së emrave

PHP pranon vetëm fjalën namespace në rreshtin e parë të kodit në çdo skedar. Të gjitha përshkrimet duhet ta ndjekin vetëm atë. Sintaksa përfshin vetëm emrin e treguar në kuptimin e zakonshëm të emrit.

Është e rëndësishme të përdoren fjalët e sakta që përcjellin kuptimin. Është më mirë kur emri është i gjatë, por përmban diçka që të jep një kuptim të qartë se për çfarë hapësire po flasim, çfarë bën, çfarë përshkruan, çfarë pranon apo për çfarë është krijuar.

Hapësirat mund të ndërtohen për një kohë të pacaktuar, por kjo nuk duhet të teprohet. Emri duhet të jetë i qartë, foleja duhet të justifikohet dhe sekuenca e emrave të hapësirës duhet të ketë logjikë.

Në aplikacionet e përdorimit dhe të hapësirës së emrave, PHP lejon kodim kompleks, por sa herë që është e mundur, është më mirë të shkoni me opsionin e thjeshtë.

Rregulli i përgjithshëm është: hapësira e emrave është një përshkrim dhe ky është një skedar, përdorimi është importimi i hapësirës në skriptin e përdorimit dhe caktimi i një pseudonimi (lidhje e shkurtër) për të.

Një shembull i thjeshtë i ngarkimit automatik të klasave (objekteve)

Detyra përmban një objekt për manipulimin e vargjeve, stilet e elementeve të faqeve (përshkrimet CSS), një objekt data, një objekt të sistemit të skedarëve dhe një objekt të bazës së të dhënave. Qëllimi i zbatimit është krijimi i ndërfaqeve të thjeshta për këto pesë pozicione në mënyrë që të përdoren aftësitë e nevojshme vetëm përmes metodave të këtyre objekteve.

Nuk lejohet përdorimi i drejtpërdrejtë i funksioneve dhe konstrukteve gjuhësore. Kjo detyrë përdor ngarkimin automatik të klasës PHP. Hapësira e emrave konsiderohet si një koleksion objektesh të vendosura në një vendndodhje specifike në sistemin e skedarëve. Në mënyrë tipike, të gjitha objektet janë të vendosura në sistemin e skedarëve sipas kuptimit të tyre, në dosje dhe në skedarë me një emër specifik.

Kodi në të majtë tregon krijimin e pesë objekteve të kërkuara, por nuk tregohet se ku ndodhen saktësisht. Kodi në të djathtë tregon tekstin e ngarkuesit automatik (skripti kryesor), i cili, kur ngarkon klasat (objektet), zëvendëson automatikisht shtegun e kërkuar për vendndodhjen e objektit dhe shtesën e skedarit .php.

Shembull i hapësirave të shumta të emrave

Biblioteka PhpOffice/PhpWord është një shembull i mirë i përdorimit të një hierarkie komplekse të hapësirave të shumta të emrave. Dosja e elementeve përmban pothuajse të gjithë gamën e elementeve të disponueshme kur krijoni një dokument *.docx (MS Word), dosjet e tjera përmbajnë mjetet e nevojshme për të punuar me elementë, paragrafë dhe tabela.

Në fakt, biblioteka u vendos në dosjen e projektit për arsye se hapësira e funksionalitetit PhpOffice / PhpWord duhej të plotësohej me mjete specifike dhe në fund të krijonte versionin tuaj të një produkti të ngjashëm.

Ngarkimi i shumë klasave të hapësirave të ndryshme të emrave

Përdorimi i autoload i hapësirës së emrave PHP, kur është e nevojshme të ngarkohen shumë klasa, dhe hierarkia e sistemit të zhvilluar të objekteve është mjaft komplekse dhe e vështirë për t'u imagjinuar, çon në nevojën për të krijuar struktura të ngurtë.

Orientimi i zhvilluesit (i cili përdor produktin për të vazhduar punën) është i mundur vetëm në kontekstin e semantikës (të kuptuarit e projektit), i cili përfaqësohet nga kombinime të përshtatshme fjalësh që pasqyrojnë kuptimin dhe marrëdhëniet reale të objekteve.

Nevoja për të përdorur bibliotekën në një projekt individual çon në zgjidhjen e problemit se si të kombinohen hapësirat e emrave të zhvilluesit dhe PhpOffice / PhpWord. Mënyra më e mirë është ta vendosni këtë produkt (hapësirat dhe objektet e tij) në hapësirën e tij të projektit.

Është e rëndësishme të theksohet se nuk do të jetë e mundur të bëhet pa modifikuar hapësirat e emrave të këtij produkti në nivelin e elementeve të tij abstrakte dhe ngarkimit të klasës. Kjo tregon se në hapësirën e emrave PHP përdorimi i hapësirave të brendshme të emrave mund të mos jetë mjaftueshëm abstrakt dhe universal.

Sistemi i skedarëve dhe lokalizimi i hapësirave

Në thelb, hapësirat e emrave janë "përvijimi" i shtegut në sistemin e skedarëve drejt objektit të dëshiruar. Përdorimi i emrave të skedarëve si emra objektesh është i natyrshëm dhe i zakonshëm. Përdorimi i emrave të dosjeve si emërtim i hapësirës së emrave është objektiv.

Organizimi "druri" i informacionit është mjaft i rëndë për t'u përdorur dhe e ndërlikon zhvillimin, por është një paraqitje e natyrshme për sistemet e objekteve.

Problemi është se faza e zhvillimit përfaqësohet nga një redaktues specifik kodi, i cili kombinon si paraqitjen e dukshme të dosjeve ashtu edhe përmbajtjen e një dosjeje specifike, por ende nuk ka asnjë redaktues që do të ofronte lëvizje nga fundi në fund përmes objekteve dhe përmes dosjet.

Problemi i abstraktitetit dhe universalitetit

Pranuar nga vetëdija dhe objektivi i zhvilluesit në realitet:

  • siguron abstraksionin dhe aftësinë për të manipuluar informacionin sipas semantikës së tij reale;
  • hapësirat e emrave pasqyrojnë pozicionin e skripteve, objekteve dhe pjesërisht kuptimin e projektit në sistemin e skedarëve

Në fakt, duke lidhur abstraksionin OOP me emrat e objekteve (skedarët) dhe duke e mbivendosur atë në sistemin e skedarëve (dosjet) me formimin adekuat të hapësirës së emrave (shtigje + emra), mund të kontrolloni formimin e hapësirave të emrave gjatë ekzekutimit të skriptit.

Programimi ka fituar tashmë një dinamikë të fuqishme zhvillimi, por nëse transferojmë procesin dhe ngarkesën e fazës së zhvillimit nga një redaktues teksti (në të cilin skriptet krijohen dhe vendosen në pemët e dosjeve) në idenë e gjenerimit të një kodi që lejon veten të përmirësohet dhe të vendoset në vendin e duhur në sistemin e skedarëve - programimi do të rritet në lartësi të reja.

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).

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ë emrit 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. Fillimisht donin ta përdornin për hapësirën e emrave, por më pas nuk pranuan 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 e prapme "\"
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(); Ju do të pajtoheni se është e vështirë të shkruash shtigje të plota në hapësirat çdo herë, 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 po përdorni një funksion global, duhet t'i paraprini 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 ) ) mbyllur ($handle ) funksioni statik privat StPutFile($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ë drejtoritë e ngjashme me hapësirën e emrave, kjo e 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ë.

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 = e re MyClass(); // 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 edhe sintaksën e 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