Przykłady wykorzystania przestrzeni nazw w php. Wyjaśnienie przestrzeni nazw w PHP. Globalna przestrzeń nazw


  • Tłumaczenie
  • Instruktaż
Uwaga za.: Mam świadomość, że w momencie tłumaczenia aktualna wersja PHP to 5.5, a także, że istnieje mądry podręcznik. Ale wydało mi się interesujące sposób, w jaki autor przedstawia funkcjonalność przestrzeni nazw. Być może artykuł ten pomoże niektórym z tych, którzy dopiero uczą się podstaw (i nie tylko innym, jest wielu brodatych programistów, którzy zdecydowali się na PHP 5.2). Hodor.

W PHP począwszy od wersji 5.3 pojawiły się przestrzenie nazw. Większość współczesnych języków od dawna ma tę funkcjonalność, ale PHP było trochę spóźnione. Jednak każda nowa funkcja ma swój cel, dowiedzmy się, jakie korzyści możemy zyskać korzystając z przestrzeni nazw.

W PHP nie można mieć dwóch klas o takich samych nazwach, wszystkie muszą być unikalne. Problem z tym ograniczeniem polega na tym, że jeśli korzystasz z biblioteki innej firmy, która udostępnia klasę o nazwie User , nie możesz utworzyć własnej klasy, również o nazwie User . To naprawdę źle, bo Użytkownik to bardzo wygodna nazwa klasy, prawda?

Przestrzenie nazw pozwalają nam obejść ten problem i możemy utworzyć tyle klas użytkowników, ile potrzebujemy. Przestrzenie nazw pozwalają nam również organizować nasz kod w wygodne pakiety, a także wskazują naszą własność tego kodu.

Przyjrzyjmy się bardzo popularnej klasie. Tak... wiem, że już z nich korzystałeś, co mają z tym wspólnego przestrzenie nazw? Po prostu mi w tej kwestii zaufaj, dobrze?

Globalna przestrzeń nazw

Oto bardzo prosta klasa:
Jak widać, nic specjalnego, a jeśli chcesz z niego skorzystać, po prostu zrób to:
Dale, trochę znam PHP...

OK, OK, przepraszam. Chodzi o to, że możemy myśleć o tej klasie jako o znajdującej się w globalnej przestrzeni nazw. Nie jestem do końca pewien, czy to właściwe określenie, ale wydaje mi się to całkiem odpowiednie. W rzeczywistości oznacza to, że klasa ta nie należy do żadnego pakietu, a jedynie do zwykłej klasy.

Łatwe korzystanie z przestrzeni nazw

Stwórzmy kolejnego Eddarda, obok globalnego.
Tutaj mamy bardzo podobną klasę z jedną małą zmianą, a mianowicie dodaniem dyrektywy dotyczącej przestrzeni nazw. Przestrzeń nazw ciągów Stark; mówi PHP, że pracujemy w przestrzeni nazw Stark i każdy kod (deklarujący klasy, funkcje, zmienne itp.) będzie się do niej odnosił.

Musimy więc stworzyć nowego Edda, jeśli zdecydujesz, że należy to zrobić w ten sposób:
Więc nie, to nieprawda. Tutaj otrzymujemy instancję klasy z pierwszego przykładu, który stworzyliśmy wcześniej. Nie ten w przestrzeni nazw Stark. Spróbujmy stworzyć instancję Eddarda Starka.
Aby utworzyć instancję klasy, musimy poprzedzić nazwę klasy prefiksem z przestrzeni nazw, do której klasa należy, i użyć jej jako ogranicznika ukośnik wsteczny. W rezultacie mamy instancję dokładnie takiej klasy, jakiej potrzebujemy. Czy to nie magiczne?

Nawiasem mówiąc, przestrzenie nazw mogą tworzyć dowolnie złożoną hierarchię, wykorzystując tyle poziomów, ile potrzeba. Na przykład:
This\Przestrzeń nazw\I\Klasa\Kombinacja\Is\Silly\Ale\Działa

Teoria względności

Pamiętasz, jak mówiłem, że PHP zawsze działa w odniesieniu do bieżącej przestrzeni nazw. Przyjrzyjmy się temu w akcji:
Dodając dyrektywę dotyczącą przestrzeni nazw, informujemy PHP, że znajdujemy się w przestrzeni nazw Starka. Ponieważ to w nim zdefiniowaliśmy klasę Eddarda, dokładnie to otrzymamy. Widzisz - wszystko jest względne.

Teraz, gdy zmieniliśmy przestrzeń nazw, mamy jeden mały problem. Masz pojęcie, o czym mówię? Jak teraz uzyskać naszą oryginalną klasę Eddarda? No cóż, ten w przestrzeni globalnej?

Na szczęście PHP ma sztuczkę, która pozwala nam rozwiązać ten problem - po prostu dodając \ do nazwy klasy.
Widząc wiodący ukośnik, PHP rozumie, że musimy wyjść poza bieżącą przestrzeń nazw i tworzy instancję potrzebnej nam klasy.

Teraz użyj swojej wyobraźni. Wyobraź sobie, że mamy klasę z innej przestrzeni nazw o nazwie Tully\Edmure. Teraz musimy go użyć w przestrzeni Starka. Jak to zrobić?

Po raz kolejny musieliśmy użyć ukośnika odwrotnego, aby przejść globalnie przed utworzeniem instancji klasy w przestrzeni Tully'ego.

Ogólnie rzecz biorąc, odwoływanie się do klas z innych takich przestrzeni nazw, używając pełnej hierarchii w nazwie, może być dość uciążliwe. Ale na szczęście istnieje możliwość zrobienia skrótu, spójrzmy:

Używając dyrektywy use, możemy uzyskać klasę z innej przestrzeni nazw. Tylko proszę, nie pytaj mnie: „dlaczego nie umieściliśmy tutaj ukośnika wiodącego”, bo po prostu nie wiem. O ile wiem, jest to jedyny wyjątek. Nie, możesz tutaj użyć ukośnika. ale nie będzie to miało żadnego sensu.

Och, jeszcze jedna mała sztuczka! Naszym importowanym klasom możemy nadać pseudonimy:
Używając słowa kluczowego as, nadaliśmy klasie Tully/Brynden pseudonim Blackfish, co pozwala nam używać nowego pseudonimu do identyfikacji jej w bieżącej przestrzeni nazw. Sprytne, prawda? Jest to również bardzo wygodne, jeśli chcesz użyć dwóch klas o takich samych nazwach w tej samej przestrzeni nazw:

Nadając Daenerys z przestrzeni Dothraków przydomek Khaleesi, możemy używać obu klas Daenerys. Całkiem wygodne, tam możemy wykorzystać wszystkie niezbędne klasy w naszej aplikacji.

Struktura

Przestrzenie nazw mogą również pomóc nam uporządkować nasz kod. Pozwól mi zademonstrować.

Załóżmy, że chcę utworzyć bibliotekę open source. Byłoby mi bardzo miło, gdyby inni mogli skorzystać z mojego kodu, byłoby wspaniale! Problem polega na tym, że nazwy klas w moim kodzie kolidują z własną aplikacją mojej biblioteki użytkownika. Byłoby to strasznie niewygodne. Oto jak rozwiązałbym ten problem:
Dayle\Blog\Content\Post Dayle\Blog\Content\Page Dayle\Blog\Tag
Tutaj użyłem mojego imienia, aby pokazać, że kod należy do mnie i oddzielić mój kod od kodu użytkownika mojej biblioteki. W podstawowej przestrzeni nazw stworzyłem strukturę klas zgodnie z ich hierarchią.

Gdy zaczniesz używać narzędzia Composer, dowiesz się, jak używać przestrzeni nazw, aby ułatwić automatyczne ładowanie kodu. Gorąco polecam przyjrzeć się temu przydatnemu mechanizmowi.

Wady

Prawdę mówiąc, czuję się trochę winny, że nazwałem ten podtytuł „Wadami”. To, o czym teraz będę mówił, tak naprawdę nie jest błędem.

Faktem jest, że w innych językach funkcjonalność przestrzeni nazw jest realizowana w podobny sposób, a jednocześnie języki zapewniają dodatkową funkcjonalność interakcji z przestrzeniami nazw.

Na przykład w Javie możesz zaimportować wiele klas do bieżącej przestrzeni nazw za pomocą instrukcji import. W Javie import jest analogiczny do użycia i używa kropek do oddzielenia zagnieżdżonych przestrzeni nazw (lub pakietów). Oto przykład:
import dayle.blog.*;
Spowoduje to zaimportowanie wszystkich klas z pakietu „dayle.blog”.

W PHP tego nie zrobisz. Każdą klasę musisz zaimportować osobno. Przepraszam. Właściwie, dlaczego przepraszam? Śmiało, złóż skargę do zespołu programistów PHP, ale proszę o grzeczność. Ostatnio zrobili wiele ciekawych rzeczy.

Oto fajny trik, który nieco złagodzi problem. Wyobraź sobie, że mamy strukturę klas z poprzedniego przykładu. Możemy wziąć część podprzestrzeni i nadać jej alias.
Może to być przydatne w przypadku korzystania z dużej liczby klas. Dobre dla wszystkich!

Wszelkie życzenia i sugestie chętnie przyjmę w wiadomości prywatnej, dziękuję.

Zmienna definiuje wartość, ale może być odniesieniem do innej zmiennej i mieć jej wartość. Podczas wykonywania algorytmu zmienna zwykle przyjmuje wiele różnych wartości. Stała przechowuje tylko jedną wartość. Obiekt jest nieprzewidywalny: ma zazwyczaj strukturę, treść i wiele cech.

Przestrzeń nazw to zbiór zmiennych, stałych, obiektów, funkcji i innych konstrukcji utworzonych przez programistę, do których można się odwoływać poprzez nazwę tej przestrzeni nazw.

Nazwy: sfera opisu danych i algorytmów

Nazwy elementów (zmiennych, stałych, obiektów, funkcji i innych konstrukcji programistycznych) nigdy się nie przecinają. PHP interpretuje każde dopasowanie nazwy jako poważny błąd, a w przypadkach, gdy nie jest w stanie jednoznacznie zidentyfikować problemu, programista otrzymuje kod, który nie działa zgodnie z oczekiwaniami, lub białe pole w przeglądarce.

Wszystkie nazwy wszystkich danych muszą być unikalne, ponieważ przestrzeń jest globalna. Nazwy obiektów i funkcji również nie powinny się powtarzać, jednak zakres globalnej widoczności zostaje przerwany w ciałach metod obiektów i funkcji. Ma swoją własną lokalną przestrzeń nazw i nic nie stoi na przeszkodzie, aby nazwać coś wewnętrznie w taki sam sposób, w jaki jest to wyznaczone zewnętrznie.

Powyższy przykład jest klasyczny, jeśli nie zwrócić uwagi na słowo kluczowe namespace: wszystko jest jak zawsze. Do drugiego zaliczają się dzieła. Przedrostek NameSpaceTwo\ przed nazwami funkcji określa, z której wstawki pochodzi kod.

Jeśli usuniemy słowo kluczowe global i operację z pierwszej funkcji $iExt = 1; przejdź do wiersza powyżej, wtedy ani pierwsza, ani druga funkcja nie będą wiedzieć o wartości zmiennej 100.

Przestrzenie nazw: wiele zakresów opisu

Pokazany przykład ma udostępniony plik, który używa dwóch wstawek. Każda wstawka ma tę samą funkcję scCheckName(). O tym, który z nich wybrać, decyduje programista, posługując się nazwą przestrzeni, która jest istotna w odpowiednim czasie i we właściwym miejscu w kodzie.

Fakt, że we wspólnym kodzie występuje ta sama nazwa (po połączeniu wstawek) nie powoduje błędu z tego prostego powodu, że każdy plik wstawki jest oznaczony swoją własną, unikalną nazwą.

W pierwszym pliku wszystko co będzie w nim opisane jest skojarzone z nazwą NameSpaceOne. W drugim pliku wszystkie opisy będą skojarzone z nazwą NameSpaceTwo.

Dopuszczalne jest dowolne powielanie nazw w obu plikach, jednak w każdym z nich jakakolwiek nazwa elementu (zmienna, stała, obiekt, funkcja) musi być unikalna.

W tym przykładzie zmiana nazwy przestrzeni nazw w wywołaniu funkcji scCheckName() zapobiegła zmianie zmiennej $iExt drugiej przestrzeni nazw. Dlatego w przykładzie specjalnie podkreślono słowo „zmieniono” – zmiana w rzeczywistości nie miała miejsca. Wartość zmiennej pozostaje taka sama.

Testowanie i wielokrotne projektowanie

Te proste przykłady pokazują, że można łatwo uprościć realizację skomplikowanych projektów, zwiększyć efektywność, produktywność i przyspieszyć pracę. Zdecydowanie od razu pojawiły się pierwsze pomysły na wykorzystanie przestrzeni nazw:

  • bezpieczne testowanie skryptów - poprzez zastąpienie przestrzeni „roboczych” analogami testowymi;
  • bezpieczne projektowanie przez duże zespoły programistów – poprzez zapewnienie im „indywidualnych” przestrzeni do opisu elementów.

Tak naprawdę przestrzeń nazw jest o wiele ważniejsza. Język PHP, przestrzeń nazw i każdy element opisu (zmienna, stała, obiekt...) od dawna zapewniają programistom możliwość niezależnego manipulowania składnią i semantyką.

Konstrukcje językowe i ogólna zasada współczesnego programowania: „zrozumiały” – wykonany – jest sprzeczność – „biały ekran” nie ma wpływu na profesjonalnego programistę.

Wielu programistów nie wie nawet, gdzie szukać komunikatu o błędzie PHP, gdy w przeglądarce nie ma nic (puste białe pole). Programista na pewnym etapie swojego rozwoju myśli w składni i semantyce PHP, „działa” automatycznie i w rezultacie powstaje jego własna składnia i własna semantyka, w granicach tego, co jest dozwolone.

Biały ekran to natychmiastowa jednoznaczna reakcja profesjonalnego programisty i błąd zostaje wyeliminowany. Po co tracić czas na debuger i przeglądanie dziennika błędów?

Obiekty, tablice i przestrzenie nazw

Można powiedzieć, że zmienne, stałe i funkcje należą już do przeszłości, ale są wykorzystywane w projektowaniu obiektów. Dobry kod ma miejsce wtedy, gdy algorytm jest reprezentowany przez oddziałujące na siebie obiekty, a nie przez sekwencję poprawnych konstrukcji.

Jeśli użyjesz tablic obiektów, zmanipulujesz ideę stosu i ostatniego (pierwszego) elementu tablicy, możesz uzyskać dynamikę: same obiekty „decydują”, jak ma działać funkcjonalność witryny w zależności od aktualnej sytuacji .

W PHP przestrzeń nazw jest specjalnym rodzajem zmiennej, reprezentowanej przez własną, unikalną nazwę, często złożoną. W kodzie używana jest nazwa przestrzeni nazw. Jeśli jest to ciąg znaków, możesz podczas wykonywania skryptu zastąpić jedną spację inną.

Jeśli PHP używa nazw przestrzeni nazw jako wartości zmiennych, jest to jeszcze bardziej obciążona semantycznie składnia, nawet silniejsza niż tablice obiektów.

Obiekt to struktura i treść charakteryzująca się jednością. Przestrzeń nazw to zbiór obiektów, elementów i relacji między nimi.

Nie ma możliwości przeprowadzania eksperymentów na działającym systemie, ale dzięki przestrzeni nazw PHP zapewnia możliwość symulowania realnie działającego systemu w innej przestrzeni w celach:

  • dalszy rozwój;
  • testowanie;
  • konserwacja itp.

Jeśli abstrahujemy od składni zaproponowanej przez twórców PHP i wyobrażamy sobie przestrzenie nazw jako globalne złożone systemy obiektów, wówczas horyzonty możliwości rozszerzają się wielokrotnie.

Składnia i użycie przestrzeni nazw

PHP akceptuje tylko słowo przestrzeń nazw w pierwszym wierszu kodu w każdym pliku. Wszystkie opisy muszą być zgodne wyłącznie z nim. Składnia obejmuje tylko nazwę oznaczoną w zwykłym znaczeniu nazwy.

Ważne jest, aby używać właściwych słów, które oddają znaczenie. Lepiej, gdy nazwa jest długa, ale zawiera coś, co daje jasne pojęcie o jakiej przestrzeni mówimy, czym się zajmuje, co opisuje, co akceptuje lub do czego została stworzona.

Spacje można zagnieżdżać w nieskończoność, ale nie należy tego nadużywać. Nazwa musi być jasna, zagnieżdżenie uzasadnione, a ciąg nazw przestrzeni musi być logiczny.

W zastosowaniach użytkowych i w przestrzeni nazw PHP pozwala na złożone kodowanie, ale jeśli to możliwe, lepiej jest skorzystać z prostej opcji.

Ogólna zasada jest taka: przestrzeń nazw to opis i jest to jeden plik, use polega na zaimportowaniu przestrzeni do skryptu use i przypisaniu jej aliasu (krótkiego linku).

Prosty przykład automatycznego ładowania klas (obiektów)

Zadanie zawiera obiekt do manipulowania ciągami znaków, style elementów strony (opisy CSS), obiekt daty, obiekt systemu plików i obiekt bazy danych. Ideą wdrożenia jest stworzenie prostych interfejsów dla tych pięciu stanowisk, aby wykorzystać niezbędne możliwości jedynie poprzez metody tych obiektów.

Niedozwolone jest bezpośrednie używanie funkcji i konstrukcji językowych. To zadanie wykorzystuje automatyczne ładowanie klasy PHP. Przestrzeń nazw jest uważana za zbiór obiektów znajdujących się w określonej lokalizacji w systemie plików. Zazwyczaj wszystkie obiekty znajdują się w systemie plików zgodnie z ich znaczeniem, w folderach i plikach o określonej nazwie.

Kod po lewej stronie wskazuje utworzenie wymaganych pięciu obiektów, ale nie jest wskazane, gdzie dokładnie się one znajdują. Kod po prawej stronie pokazuje tekst autoloadera (skryptu głównego), który podczas ładowania klas (obiektów) automatycznie podstawia wymaganą ścieżkę do lokalizacji obiektu i rozszerzenia pliku .php.

Przykład wielu przestrzeni nazw

Biblioteka PhpOffice/PhpWord jest dobrym przykładem wykorzystania złożonej hierarchii wielu przestrzeni nazw. Folder Elementy zawiera niemal całą gamę elementów dostępnych przy tworzeniu dokumentu *.docx (MS Word), pozostałe foldery zawierają niezbędne narzędzia do pracy z elementami, akapitami i tabelami.

Właściwie bibliotekę umieszczono w folderze projektu z tego powodu, że przestrzeń funkcjonalności PhpOffice / PhpWord wymagała uzupełnienia o konkretne narzędzia i docelowo stworzenia własnej wersji podobnego produktu.

Ładowanie wielu klas różnych przestrzeni nazw

Stosowanie autoloadu przestrzeni nazw PHP, gdy konieczne jest załadowanie wielu klas, a hierarchia opracowanego systemu obiektów jest dość złożona i trudna do wyobrażenia, prowadzi do konieczności tworzenia sztywnych struktur.

Orientacja dewelopera (który wykorzystuje produkt do dalszej pracy) jest możliwa jedynie w kontekście semantyki (zrozumienia projektu), którą reprezentują odpowiednie kombinacje słów, które oddają rzeczywiste znaczenie i relacje obiektów.

Konieczność wykorzystania biblioteki w indywidualnym projekcie prowadzi do rozwiązania problemu połączenia przestrzeni nazw dewelopera i autora PhpOffice / PhpWord. Najlepszym sposobem jest umieszczenie tego produktu (jego przestrzeni i obiektów) we własnej przestrzeni projektowej.

Warto zaznaczyć, że nie obejdzie się bez modyfikacji przestrzeni nazw tego produktu na poziomie jego elementów abstrakcyjnych i ładowania klas. Oznacza to, że w przestrzeni nazw PHP użycie wewnętrznych przestrzeni nazw może nie być wystarczająco abstrakcyjne i uniwersalne.

Lokalizacja systemu plików i przestrzeni

Zasadniczo przestrzenie nazw to „zarys” ścieżki w systemie plików do żądanego obiektu. Używanie nazw plików jako nazw obiektów jest naturalne i powszechne. Używanie nazw folderów jako nazw przestrzeni nazw jest obiektywne.

„Drewniana” organizacja informacji jest dość uciążliwa w obsłudze i komplikuje rozwój, ale stanowi naturalną reprezentację systemów obiektów.

Problem w tym, że etap rozwoju jest reprezentowany przez specyficzny edytor kodu, który łączy zarówno widoczną reprezentację folderów, jak i zawartość konkretnego folderu, ale nie ma jeszcze edytora, który zapewniałby kompleksowe poruszanie się po obiektach i poprzez lornetka składana.

Problem abstrakcji i uniwersalności

Przyjęty przez świadomość dewelopera i cel w rzeczywistości:

  • zapewnia abstrakcję i możliwość manipulowania informacją zgodnie z jej rzeczywistą semantyką;
  • przestrzenie nazw odzwierciedlają położenie skryptów, obiektów i częściowo znaczenie projektu w systemie plików

W rzeczywistości, łącząc abstrakcję OOP z nazwami obiektów (plikami) i nakładając ją na system plików (foldery) z odpowiednią formacją przestrzeni nazw (ścieżki + nazwy), można kontrolować tworzenie przestrzeni nazw podczas wykonywania skryptu.

Programowanie nabrało już potężnej dynamiki rozwoju, jeśli jednak przeniesiemy proces i obciążenie etapu deweloperskiego z edytora tekstu (w którym tworzone są skrypty i umieszczane w drzewach folderów) na pomysł wygenerowania kodu, który pozwala na ulepszenie i umieszczenie go we właściwym miejscu w systemie plików - programowanie wzniesie się na nowy poziom.

Niedawno umieściłem mój projekt w przestrzeni nazw i napotkałem problem braku odpowiedniej dokumentacji. Wszystko co udało nam się znaleźć pochodzi z około 2009 roku, a jest prawie 2012... W znalezionym materiale jest sporo niedziałających miejsc, które korzystają z czegoś, czego nie ma w aktualnej wersji php. W związku z tym chciałbym rzucić nieco światła na tę kwestię.
Czym jest przestrzeń nazw lub przestrzeń nazw? Wielka Wikipedia definiuje je w ten sposób:

Przestrzeń nazw to zbiór, czyli model, abstrakcyjny magazyn lub środowisko stworzone w celu logicznego grupowania unikalnych identyfikatorów (czyli nazw). Identyfikator zdefiniowany w przestrzeni nazw jest powiązany z tą przestrzenią nazw. Ten sam identyfikator można niezależnie zdefiniować w wielu spacjach. Zatem wartość powiązana z identyfikatorem zdefiniowanym w jednej przestrzeni nazw może (ale nie musi) mieć to samo (lub raczej inne) znaczenie co ten sam identyfikator zdefiniowany w innej przestrzeni nazw. Języki rozpoznające przestrzeń nazw definiują reguły wskazujące, do której przestrzeni nazw należy identyfikator (czyli jego definicja).wiki

Wszystko jasne? To właściwie proste. Przed wersją 5.3 w php były tylko dwie spacje - globalna (w której wykonywany był główny kod) i lokalna (w której zdefiniowano zmienne funkcyjne).

Od wersji 5.3 wszystko się zmieniło. Teraz możesz zdefiniować swoją przestrzeń nazw, w której będą istnieć Twoje klasy, metody itp.


Mam nadzieję, że stało się trochę jaśniej.

Specjalnie nazwałem te klasy w ten sam sposób. Ponieważ są one zdefiniowane w różnych przestrzeniach, są to dwie różne klasy, pomimo tych samych nazw. Główny skrypt nadal funkcjonuje w przestrzeni globalnej, nic się tutaj nie zmieniło i nadal można w nim definiować klasy i funkcje. Po co więc są spacje? Po pierwsze, aby mieć pewność, że po dołączeniu pliku do jakiegoś frameworka lub biblioteki, twoje klasy nie zastąpią klas frameworka i odwrotnie.

Aby skorzystać z klas zdefiniowanych w Twojej przestrzeni nazw, musisz zaimportować zdefiniowaną przez siebie przestrzeń do przestrzeni globalnej w odpowiednim miejscu (zwykle wolę to robić na początku pliku. Aby to zrobić, użyj słowa kluczowego use).

Uwaga: z jakiegoś powodu php nie pozwala na użycie słowa kluczowego używać w blokach warunkowych i pętlach

Weźmy przykład ze zdjęć i zaimplementujmy go w kodzie:

Uwaga: słowo kluczowe namespace musi znajdować się na samym początku pliku, zaraz po nim
plik A.php
plik B.php
Możliwa jest alternatywna składnia:
Zaleca się zadeklarowanie każdej przestrzeni nazw w osobnym pliku. Chociaż jest to możliwe w jednym, zdecydowanie nie jest zalecane!
Przejdźmy teraz do trzeciego pliku, w którym będzie funkcjonował nasz główny skrypt
indeks.php
Wydawać by się mogło, że to zaleta, dodaje się tylko więcej kodu, jednak nie jest to do końca prawdą, nieco dalej podam przykład klasy autoload, przy której niepotrzebne będą linie łączące pliki z klasami.
Przyjrzyjmy się teraz naszym klasom.

Uwaga: używając operatora rozpoznawania zakresu (::) w przestrzeniach nazw php niedozwolony! Jedyne do czego się nadaje to dostęp do metod i stałych klas statycznych. Początkowo chcieli użyć go w przestrzeni nazw, ale potem zrezygnowali z tego ze względu na powstałe problemy. Dlatego konstrukcja taka jak A::A::say(); jest nieprawidłowy i spowoduje błąd.

W przypadku przestrzeni nazw należy użyć ukośnika odwrotnego „\”
Uwaga: Aby uniknąć nieporozumień, należy pominąć ten znak, gdy jest on używany w ciągach znaków: „\\”

Przestrzenie nazw można zagnieżdżać jedna w drugiej, dodajmy do naszego pliku A.php:
a w indeksie napiszemy co następuje:

Ważną kwestią jest używanie aliasów dla importowanych przestrzeni. Możesz napisać A\subA::say(); Zgodzisz się, że trudno jest za każdym razem zapisywać pełne ścieżki do spacji; aby tego uniknąć, wprowadzono aliasy. Podczas kompilacji wydarzy się co następuje: zamiast aliasu sub zostanie podstawione A\subA, więc otrzymamy wywołanie A\subA::say();

Co w takim razie dzieje się przy wywoływaniu funkcji zdefiniowanych w przestrzeni globalnej? PHP najpierw szuka funkcji w przestrzeni, w której aktualnie pracujesz, a jeśli jej nie znajdzie, przechodzi do zasięgu globalnego. Aby od razu zasygnalizować, że korzystasz z funkcji globalnej, musisz poprzedzić ją ukośnikiem odwrotnym.

Aby uniknąć problemów z automatycznym ładowaniem klas z przestrzeni, system plików musi być zorganizowany podobnie jak organizacja przestrzeni. Na przykład mamy folder główny klas, w którym będą przechowywane nasze klasy, a następnie nasze przestrzenie można zorganizować w następujący sposób
klasy\A\A.php
class\A\sub\A.php (podprzestrzeń zostanie umieszczona w osobnym pliku)
klasy\B\B.php

PHP ma magiczną stałą __NAMESPACE__, która zawiera nazwę bieżącej przestrzeni.

A teraz o automatycznym ładowaniu.

Poniższa klasa nie jest moja, po prostu ją uruchomiłem i trochę ulepszyłem, zaczerpnięta stąd.
Uwaga: Aby Twoje klasy mogły zostać załadowane, nazwa klasy musi odpowiadać nazwie pliku!

„.$plik”. w " .$filepath)); if (file_exists($filepath)) ( if(Autoloader::debug) Autoloader::StPutFile(("connected " .$filepath)); $flag = FALSE; require_once($filepath); break; ) Autoloader::recursive_autoload($plik, $ścieżka2, &$flag); ) zamknięteir($uchwyt); ) prywatna funkcja statyczna StPutFile($dane) ( $dir = $_SERVER["DOCUMENT_ROOT"] . / Log/Log.html"; $plik = fopen($katalog, "a"); flock($plik, LOCK_EX); fwrite($plik, ("║" .$data .."=>" .date(" d.m.Y Jego") ."

" .PHP_EOL)); flock($plik, LOCK_UN); fclose ($plik); ) ) \spl_autoload_register("yourNameSpace\Autoloader::autoload"); )
Jeśli spojrzysz na nazwy klas, które są ładowane, zobaczysz, że każda klasa jest poprzedzona przedrostkiem z używanej przestrzeni nazw. Dlatego zalecam używanie lokalizacji plików w katalogach podobnych do przestrzeni nazw; przyspiesza to wyszukiwanie do jednej lub dwóch iteracji.

Teraz nasz indeks można zapisać w następujący sposób:
Teraz wszystkie klasy i interfejsy, których będziesz używać, zostaną załadowane automatycznie.

Aby zademonstrować niektóre dynamiczne możliwości języka ze spacjami, zadeklarujmy inną klasę:
test.php

Index.php
powiedzNazwa("test"); //lub możesz wykonać test\sayName("test2"); //lub w ten sposób $obj::sayName("test"); //lub możesz wykonać ten test::sayName("test2");

Mam nadzieję, że mój artykuł będzie komuś przydatny.

Cześć. W dzisiejszym artykule przyjrzymy się, czym są przestrzenie nazw w PHP.

Jeśli używasz go przez dłuższy czas Ups, to prawdopodobnie spotkałeś się z sytuacją, w której podczas podłączania zewnętrznej biblioteki doświadczyłeś niepowodzenia, ponieważ używasz już w swoim kodzie tych samych nazw klas, co w bibliotece. Może się to szczególnie zdarzyć, jeśli używasz popularnych nazw, takich jak "Model", „baza danych” i tak dalej. Powiem ci teraz, jak to naprawić.

Przestrzeń nazw- jest to swego rodzaju magazyn stworzony do abstrakcyjnego grupowania unikalnych identyfikatorów (nazw).

Te. Jeśli użyjesz przestrzenie nazw, wtedy możesz bezpiecznie podłączyć biblioteki innych firm i nie obawiać się, że będą miały takie same nazwy jak w Twoim kodzie. Skończmy z teorią i przejdźmy do praktyki.

Utwórzmy plik mojaklasa.php z tą treścią

przestrzeń nazw mój\oneProject;
klasa MojaKlasa ( )
?>

Tutaj utworzyliśmy klasę w przestrzeni nazw mój\jedenProjekt. Nawiasem mówiąc, musisz napisać dokładnie ukośnik odwrotny. Nie daj się zwieść!

Teraz w pliku indeks.php napiszmy co następuje

require_once("mojaklasa.php");
$mc = nowa MojaKlasa(); // Błąd: nie znaleziono klasy
$mc = nowy mój\oneProject\MojaKlasa(); // wszystko działa
?>

Jak widać, teraz nie da się tak po prostu stworzyć klasy, trzeba określić w której przestrzeń nazw on leży.

Możemy podać kilka na raz przestrzenie nazw w jednym pliku

Projekt przestrzeni nazw;

Stała CONNECT_OK = 1;
klasa Połączenie ( )
funkcja połącz() ( )

Przestrzeń nazwInny projekt;

Stała CONNECT_OK = 1;
klasa Połączenie ( )
funkcja połącz() ( )
?>

Pomimo tego, że mamy absolutnie identyczne nazwy klas, funkcji i stałych, nie będziemy mieli konfliktu nazw, bo leżą w różnych przestrzeniach.

Możemy także użyć składni nawiasów.

Projekt przestrzeni nazw (

Stała CONNECT_OK = 1;
klasa Połączenie ( )
funkcja połącz() ( )
}

Przestrzeń nazw Inny projekt (

Stała CONNECT_OK = 1;
klasa Połączenie ( )
funkcja połącz() ( )
}
?>

Jeśli połączysz kod w globalna przestrzeń nazw z kodem w innych spacjach, wówczas używana jest tylko składnia z nawiasami.

Projekt przestrzeni nazw (

Stała CONNECT_OK = 1;
klasa Połączenie ( )
funkcja połącz() ( )
}

Przestrzeń nazw ( // kod globalny
początek_sesji();
$a = Projekt\connect();
echo Projekt\Połączenie::start();
}
?>

Nie zapominaj także, że zdefiniowanie przestrzeni nazw powinno zawsze odbywać się w pierwszej linijce kodu. Jeśli napiszesz w ten sposób, pojawi się błąd

Aby dowiedzieć się, w której przestrzeni nazw się aktualnie znajdujesz, możesz użyć stałej __PRZESTRZEŃ NAZW__

Projekt przestrzeni nazw;
echo """, __NAMESPACE__, """; // wypisze „Projekt”
?>

Używając tej stałej, możesz na przykład dynamicznie konstruować nazwy

Projekt przestrzeni nazw;

Funkcja incl($nazwa klasy) (
$a = __PRZESTRZEŃ NAZW__ . "\\" . $nazwa klasy;
zwróć nowe $a;
}
?>

To tyle na dzisiaj. Więcej informacji i wiedzy praktycznej można zdobyć biorąc udział w kursie