Przykłady wykorzystania przestrzeni nazw w php. Wyjaśnienie przestrzeni nazw w PHP. Przestrzenie nazw: wiele zakresów opisu

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 już 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 zatem 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 należy zaimportować zdefiniowaną przez siebie przestrzeń do przestrzeni globalnej w odpowiednim miejscu (ja zazwyczaj wolę to robić na początku pliku).W tym celu należy użyć 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 to 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($file, $path2, &$flag); ) )closedir($handle); ) ) prywatna funkcja statyczna StPutFile($data) ( $dir = $_SERVER["DOCUMENT_ROOT"] ." /Log/Log.html"; $plik = fopen($katalog, "a"); flock($plik, LOCK_EX); fwrite($plik, ("║" .$dane ."=>" .date(" d.m.Y H:i:s").

" .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 stosowanie 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.

PHP, począwszy od wersji 5.3, udostępniało nam przestrzenie nazw. Od tego czasu toczyła się powolna i gorąca dyskusja na temat korzystania z tej przestrzeni nazw?
Niektóre frameworki, takie jak Symphony, Laravel i oczywiście Zend, przyjęły tę technologię.
Wszystko to mniej więcej mieści się w schemacie MVC. Pozostaje jedna, chyba odwieczna debata: jaka powinna być główna para małżeńska aplikacji – Model i Kontroler?
Niektórzy mówią nam, że Modelka powinna być tęga i gruba, a wraz z nią szczupła i szczupła Kontrolerka. Jednym słowem – matriarchat.
Inni wręcz przeciwnie, uważają, że Kontroler musi wszystkim zarządzać i dowodzić, dzięki czemu okazuje się solidny i dobrze odżywiony. A wraz z nim szczupły, smukły Model, którego zadanie sprowadza się do dawania i dawania. To jest patriarchat.
Co więc jest lepsze w schemacie MVC? Patriarchat czy matriarchat?
Spójrzmy na to z perspektywy budowania jednostki rodzinnej w oparciu o demokrację. I niech Namespace nam w tym pomoże.

Nie lubimy grubych, niezgrabnych kontrolerów, które niczym byk w sklepie z porcelaną mogą zmiażdżyć całą aplikację, jeśli nie będziesz ostrożny.
Nie lubimy też grubych Modelek. No i kto je lubi? Muszą zasłużyć na podium!
Spróbujmy za pomocą Namespace, niczym dobrego swata, stworzyć zgraną rodzinę.

Najpierw utwórzmy szkielet aplikacji. Choć może to być banalne, niech to będzie blog.

Stworzyliśmy podstawową strukturę, w której:

  • Blog to miejsce przechowywania naszej aplikacji;
  • Widoki i szablony - przechowywanie widoków i szablonów;
  • Narzędzie - repozytorium bibliotek współdzielonych;
  • indeks.php - skrypt ładujący;
  • Poczta – tu powinna rozgrywać się rodzinna idylla Kontrolera i Modelki.

Z Index.php wszystko jest proste:

uruchomić(); /* * koniec indeksu.php */

Określamy niezbędne ścieżki i tworzymy autoloader.
Autoloader ładuje wymagane klasy, które znajdują się w hierarchii folderów zgodnie z przestrzenią nazw klas. Na przykład klasa BlogPostServicesView będzie wyszukiwana w Blog/Post/Services.
A oto pierwsze spotkanie z Namespace.
Kiedy uruchamiamy plik Index.php, tworzymy instancję aplikacji Blog, której klasa jest ładowana z Blog/Blog.php.
Spójrzmy na niego.

post = nowy post(); ) funkcja publiczna run() ( $this->post->view->all(); ) )//end class Blog

Tworząc klasę Blog, wstrzykujemy do niej klasę Post z przestrzenią nazw BlogPost, a autoloader ładuje ją z Blog/Post/Post.php.
Prawdopodobnie tę klasę można nazwać Kontrolerem,

widok = nowy widok(); ) )//koniec zajęć Post

Jednostka Post zawiera:
- struktura samego rekordu danych - BlogPostEntitiesPostEntity.php

Usługi obsługujące żądania Kontrolera - BlogPostServicesView.php (na przykład jedna z usług)

db = nowy DB(); )//end __construct funkcja publiczna all() ( $posts = $this->db->survey(); Contemplate::compose(array("header" => "header", "main" => "main", "footer" => "stopka",), array("posts" => $posts, "title" => "Witryna Vipera",)); ) )//end class PostView

System interakcji z bazą danych - BlogPostRepositoriesDB.php - oto nasz cienki, elegancki Model,
Po prostu daj, przynieś i nic więcej!

dbh = nowe PDO("mysql:host=localhost;nazwa bazy danych=test", $użytkownik, $pass, tablica(PDO::ATTR_PERSISTENT => true)); ) catch (PDOException $e) ( echo "Błąd!: " . $e->getMessage() . "
"; die(); ) )//end __construct funkcja publiczna Survey() ( $query_view = $this->dbh->prepare("WYBIERZ * z postów"); $query_view->execute(); return $query_view- >fetchAll(PDO::FETCH_CLASS, "BlogPostEntitiesPostEntity"); )//zakończ ankietę )//zakończ klasę Db

W rezultacie udało nam się stworzyć strukturę aplikacji, w której wszystkie komponenty są dobrze powiązane, przy jednoczesnym uzyskaniu wyraźnego podziału klas, gdzie każda klasa realizuje swoje własne zadanie. Nasz kontroler jest cienki i jednocześnie mocny. Model do niego pasuje. Idealna rodzina!
A wszystko dzięki Namespace.

Nie twierdzę, że w wielu przypadkach ramy są wygodne. Ale spójrz, Namespace niczego Ci nie przypomina?
Przejrzysty podział na klasy, ścisła i jednocześnie elastyczna hierarchia katalogów i klas, całkowicie podporządkowana deweloperowi.
Czasami nie ma tak znaczącego dodatku w postaci setek plików i klas w formie frameworka.
Brak prokrustowego łoża zasad interakcji klas i komponentów.

Inspiracją do napisania artykułu były przemyślenia na ten temat Taylora Otwella, autora frameworka Laravel, za co mu serdecznie dziękujemy.
Adres przykładowego kodu źródłowego w serwisie GitHub.

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 również 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

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 już 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 zatem 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 należy zaimportować zdefiniowaną przez siebie przestrzeń do przestrzeni globalnej w odpowiednim miejscu (ja zazwyczaj wolę to robić na początku pliku).W tym celu należy użyć 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 to 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($file, $path2, &$flag); ) )closedir($handle); ) ) prywatna funkcja statyczna StPutFile($data) ( $dir = $_SERVER["DOCUMENT_ROOT"] ." /Log/Log.html"; $plik = fopen($katalog, "a"); flock($plik, LOCK_EX); fwrite($plik, ("║" .$dane ."=>" .date(" d.m.Y H:i:s").

" .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 stosowanie 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.

(PHP 5 >= 5.3.0, PHP 7)

Zanim omówimy użycie przestrzeni nazw, ważne jest, aby zrozumieć, skąd PHP wie, jakiego elementu przestrzeni nazw żąda Twój kod. Można dokonać prostej analogii pomiędzy przestrzeniami nazw PHP a systemem plików. Istnieją trzy sposoby uzyskania dostępu do pliku w systemie plików:

  1. Względna nazwa pliku, np foo.txt. To rozwiązuje katalog bieżący/foo.txt gdzie bieżącykatalog jest aktualnie zajętym katalogiem. Więc jeśli bieżący katalog to /home/foo, nazwa oznacza /home/foo/foo.txt.
  2. Względna nazwa ścieżki, np podkatalog/foo.txt. To rozwiązuje bieżącykatalog/podkatalog/foo.txt.
  3. Bezwzględna nazwa ścieżki, np /main/foo.txt. To rozwiązuje /main/foo.txt.
Tę samą zasadę można zastosować do elementów znajdujących się w przestrzeni nazw w PHP. Na przykład do nazwy klasy można odnosić się na trzy sposoby:
  1. Niekwalifikowana nazwa lub nazwa klasy bez przedrostka, np $a = nowe foo(); Lub foo::metoda statyczna(); bieżąca przestrzeń nazw, to się rozwiązuje bieżąca przestrzeń nazw\foo bla. Jedno zastrzeżenie: niekwalifikowane nazwy funkcji i stałych zostaną zamienione na funkcje i stałe globalne, jeśli funkcja lub stała z przestrzenią nazw nie zostanie zdefiniowana. Aby uzyskać szczegółowe informacje, zobacz Używanie przestrzeni nazw: powrót do funkcji/stałej globalnej.
  2. Nazwa kwalifikowana lub nazwa klasy z przedrostkiem, np $a = nowa podprzestrzeń nazw\foo(); Lub przestrzeń podnazw\foo::staticmethod();. Jeśli bieżąca przestrzeń nazw to bieżąca przestrzeń nazw, to się rozwiązuje bieżąca przestrzeń nazw\przestrzeń podnazw\foo. Jeśli kod jest kodem globalnym, bez przestrzeni nazw, jest to rozwiązywane podprzestrzeń nazw\foo.
  3. W pełni kwalifikowana nazwa lub nazwa z prefiksem z globalnym operatorem prefiksu, np $a = nowa \bieżącaprzestrzeńnazw\foo(); Lub \currentnamespace\foo::staticmethod();. Zawsze sprowadza się to do dosłownej nazwy określonej w kodzie, bieżąca przestrzeń nazw\foo.

Oto przykład trzech rodzajów składni w rzeczywistym kodzie:

przestrzeń nazw Foo\Bar\subnamespace;

stała FOO = 1;
funkcja foo()()
klasa, fuj
{
}
?>

przestrzeń nazw Foo\Bar;
dołącz „plik1.php”;

stała FOO = 2;
funkcja foo()()
klasa, fuj
{
funkcja statyczna metoda statyczna()()
}

/* Niekwalifikowana nazwa */
bla(); foo::metoda statyczna(); echo FOO;

/* Nazwa kwalifikowana */
podprzestrzeń nazw\foo(); // zamienia się w funkcję Foo\Bar\subnamespace\foo
podprzestrzeń_nazw\foo::staticmethod(); // przekształca się w klasę Foo\Bar\subnamespace\foo,
// metoda statyczna
echo podprzestrzeń nazw\FOO; // zamienia się w stałą Foo\Bar\subnamespace\FOO

/* Pełna nazwa */
\foo\bar\foo(); // zamienia się w funkcję Foo\Bar\foo
\foo\bar\foo::staticmethod(); // przekształca się w klasę Foo\Bar\foo, metoda staticmethod
echo\Foo\Bar\FOO; // zamienia się w stałą Foo\Bar\FOO
?>

Należy pamiętać, że aby uzyskać dostęp do dowolnej globalnej klasy, funkcji lub stałej, można użyć w pełni kwalifikowanej nazwy, np \strlen() Lub \Wyjątek Lub \INI_ALL. ?>