PHPDevs

Projekt obiektowy z Composerem i Twigiem? Czytaj!

Programowanie obiektowe > Lekcja 9

Przestrzenie nazw

To w zasadzie ostatnia kwestia, jaką chcę na ten moment omówić w temacie podstaw obiektowości. Przestrzenie nazw umożliwiają zadeklarowanie wielu klas o takiej samej nazwie. W jakich sytuacjach to się może przydać? Przede wszystkim gdy dodajemy do naszego kodu biblioteki innych programistów. Nie mamy wpływu na nazewnictwo w tym kodzie, a więc ryzyko powielenia nazwy klasy wzrasta. Poza tym, dzięki przestrzeniom nazw czytelność kodu wzrasta - widzimy od razu która klasa czego dotyczy.

Przestrzeń nazw musimy zadeklarować jako pierwszą instrukcję w pliku. Robimy to bardzo prosto, przy użyciu namespace.

<?php
namespace PHPDevs;

Możemy też zadeklarować podprzestrzeń, na przykład:

<?php
namespace PHPDevs\Course;

W momencie takiej deklaracji klasy, funkcje i stałe zdefiniowane przez const w tym pliku nie będą domyślnie widoczne w innej. Zobaczmy to w praktyce.

lesson.php<?php
namespace PHPDevs\Course;

class Lesson
{

}
index.php<?php
require_once 'lesson.php';

$lesson = new Lesson();

Efekt?

Fatal error: Uncaught Error: Class 'Lesson' not found in ...

Jak skorzystać z elementów znajdujących się w przestrzeni nazw PHPDevs poza nią? Musimy je zaimportować.

index.php<?php
require_once 'lesson.php';

use PHPDevs\Course\Lesson;

$lesson = new Lesson();

W powyższym przykładzie przy użyciu use wskazujemy klasę do zaimportowania. Po tej operacji odwołujemy się do niej normalnie, po samej nazwie. Możemy też zrobić to bezpośrednio w momencie jej tworzenia, na przykład tak:

index.php<?php
require_once 'lesson.php';

use Lesson;

$lesson = new PHPDevs\Course\Lesson();
Podobnie sytuacja wygląda z funkcjami i stałymi, ale żeby je importować dodajemy odpowiednio słowo function lub const.
<?php
use function PHPDevs\Course\getTitle;

getTitle();
    
// -----

PHPDevs\Course\getTitle();
<?php
use const PHPDevs\Course\NUMBER;

echo NUMBER;
    
// -----

echo PHPDevs\Course\NUMBER;

Jak zadeklarowana przestrzeń nazw może być tylko jedna, tak importować możemy dowolną ilość razy. Ważne jednak, aby nie powtórzyły się elementy o takiej samej nazwie. A jeśli zdarzyłoby się, że musimy powtórzy to i na to jest rozwiązanie - aliasy. Umożliwiają one nadanie jakby innej nazwy.

index.php<?php
require_once 'lesson.php';

use PHPDevs\Course\Lesson as PHPLesson;

$lesson = new PHPLesson();
$lesson = new Lesson(); // error

Warto wiedzieć

Standard PSR-2 mówi, że zarówno za deklaracją przestrzeni nazw jak i blokiem importów musi nastąpić linia przerwy.

Od PHP 7 mamy także możliwość importu wielu klas, funkcji czy stałych w jednym use. We wcześniejszych wersjach jednak taki kod nie zadziała.

<?php

use PHPDevs\Course\{Lesson, Category};

$lesson = new Lesson();
$category = new Category();

Wspomnę jeszcze o możliwości deklaracji wielu przestrzeni nazw w jednym pliku. Z mojego doświadczenia wynika, że w praktyce bardzo rzadko się to spotyka, więc szczegóły możesz doczytać w dokumentacji.

Praktyka?

No właśnie, jak to wygląda w praktyce? Obecnie każdy poważny projekt korzysta z Composera i autoloadingu przez PSR-4, o którym powiemy sobie już w następnym rozdziale. Polega to w skrócie na tym, że umieszczamy klasy w odpowiednich folderach, tak, aby były zgodne z przestrzeniami nazw, dzięki czemu są automatycznie dodawane. Ręcznie dołączamy tylko jeden plik, reszta robi się sama :) Co za tym idzie, w jednym pliku deklaruje się jedną klasę i jedną przestrzeń nazw. Ale spokojnie, niedługo zrobimy w kursie kolejny projekt, gdzie będzie to wszystko dokładnie widać.

Przestrzenie nazw są rzeczą, którą z pewnością trzeba znać. Lecz ich wykorzystanie wydaje się chyba dość łatwe i nie wymaga specjalnej nauki.

Poprzednia lekcja Dalej

Udostępnij

  • Facebook
  • Twitter
  • Google+

Komentarze