Jedną z najbardziej wyczekiwanych funkcjonalności po wprowadzeniu do PHP obiektowości z prawdziwego zdarzenia, były przestrzenie nazw. Jeszcze przed swoim pojawieniem się budziły kontrowersje za sprawą separatora. Nie dość, że mamy do dyspozycji strzałkę (dla obiektów, ich metod oraz właściwości), podwójny dwukropek (dla statycznych metod i właściwości), to dostaliśmy kolejny symbol – backslash, oddzielający od siebie kolejne przestrzenie nazw. Niezależnie od tego, czy symbol ten się nam podoba, czy też nie, warto wiedzieć co to są przestrzenie nazw i jak z nich korzystać.
Co to są przestrzenie nazw i po co powstały?
Odpowiedź na powyższe pytanie najlepiej będzie przedstawić na przykładzie. Załóżmy, że tworzymy duży projekt, w skład którego będzie wchodzić kilka aplikacji, między innymi blog oraz forum. Tak się składa, że obie aplikacje posiadają klasę o takiej samej nazwie – Entry, będącą obiektową reprezentacją pojedynczego posta/wpisu. Jeśli stworzymy widok prezentujący wpisy na blogu oraz posty na forum pojedynczego użytkownika, staniemy przez problemem doskonale opisanym w poniższym błędzie.
Fatal error: Cannot redeclare class Entry
W tym właśnie celu powstały przestrzenie nazw, które tworzą, jak sama nazwa wskazuje, przestrzeń, w której nazwa klasy musi pozostać unikatowa. Jeśli wykorzystane przez nas aplikacje posiadałyby przestrzenie nazw, np Blog oraz Forum, wówczas wspomniany błąd nie miałby miejsca.
Definiowanie przestrzeni nazw
Przestrzeń nazw musi zostać zdefiniowana w pierwszym wierszu pliku. W przeciwnym wypadku PHP zgłosi błąd. Przestrzeń nazw będzie miała wpływ klasy, funkcje oraz stałe.
namespace Foo;
class Bar
{
public function baz()
{
$out = 'Przestrzen nazw: ' . __NAMESPACE__ . PHP_EOL
. 'Klasa: ' . __CLASS__ . PHP_EOL
. 'Metoda: ' . __METHOD__ . PHP_EOL;
return $out;
}
}
function funckja()
{
return __FUNCTION__;
}
const STALA = 'abc';
Jeśli uruchomimy powyższy kod
$foo = new Foo\Bar();
echo $foo->baz();
echo Foo\funckja();
echo Foo\STALA;
uzyskamy w efekcie
Przestrzen nazw: Foo
Klasa: Foo\Bar
Metoda: Foo\Bar::baz
Foo\funckja
abc
W przypadku bardziej skomplikowanych projektów zachodzi potrzeba zagnieżdżania przestrzeni nazw. Definiowanie zagnieżdżonych przestrzeni nazw nie różni się niczym od “standardowych” przestrzeni. Nazwy kolejnych zagnieżdżeń oddzielamy, a jakże, backslashem.
namespace Foo\Bar\Baz;
Wszystkich, którzy czują się nieswojo bez klamer, ucieszy na pewno wiadomość, iż w przypadku przestrzeni nazw również możemy z nich korzystać.
namespace Foo
{
/* klasy funkcje i stałe */
}
Zabawa z widocznością
Podobnie jak ma to miejsce w przypadku dołączania plików, przestrzenie nazw mogą spowodować zwiększenie ilości WTF na minutę. A to za sprawą sposobu w jaki PHP określa przestrzeń, w której się aktualnie znajdujemy. Jeśli nie straszne dla są zabawy ze ścieżkami plików, z tym również sobie poradzimy.
Manual wymienia trzy sposoby określania przestrzeni nazw wykorzystywanej klasy, funkcji lub stałej. Są to:
Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Zwiń
Czytaj na blogu autora...