Poza prefiksami: Przewodnik dla programistów WordPress po przestrzeniach nazw PHP
Opublikowany: 2019-11-12Przedstaw wszystko.
Jest to przysłowie, które jest stare jak samo oprogramowanie WordPress. Prefiksy były standardem dla programistów WordPress od tak dawna, że trudno sobie wyobrazić robienie czegoś innego. Ale nadszedł czas na coś nowego. Cóż, jest to już dawno spóźnione, ale WordPress pozostaje nieco w tyle w standardowych praktykach w większym świecie PHP.
Prefiksy to praktyka tworzenia przyjaznej dla kodu wersji nazwy projektu i umieszczania jej na początku funkcji, klas i innych rzeczy w globalnej przestrzeni nazw. Na przykład nazwałbyś funkcję tavern_get_post() zamiast get_post() , aby uniknąć kolizji nazw funkcji, które skutkowałyby błędem krytycznym.
Prefiksy to jedna z form „przestrzeni nazw”, która jest tylko wymyślnym sposobem powiedzenia, że nazwy w tej przestrzeni należą do konkretnego projektu. Jednak przedrostki (i przyrostki, które są mniej powszechne) to hack z czasów, gdy nie istniało rozwiązanie dla języka PHP.
PHP 5.3 wprowadziło oficjalną metodę przestrzeni nazw, więc standard istnieje od lat. Ponieważ WordPress 5.2 podniósł minimalne wymagania PHP do 5.6, nadszedł czas, aby programiści porzucili stare nawyki i dogonili resztę świata PHP.
Przestrzeń nazw (prawie) wszystko
Przestrzenie nazw PHP obejmują tylko następujące elementy.
- Klasy
- Interfejsy
- Cechy
- Funkcje
- Stałe zadeklarowane za pomocą słowa kluczowego
const, ale niedefine()
Jeśli chodzi o uchwyty skryptów, nazwy rozmiarów obrazów, opcje bazy danych i inne elementy w globalnej przestrzeni nazw, nadal musisz je poprzedzać. To są identyfikatory i są poza zakresem przestrzeni nazw PHP.
Jak tworzyć przestrzenie nazw
Przestrzenie nazw można łatwo zadeklarować. Na górze dowolnego pliku PHP, w którym chcesz użyć określonej przestrzeni nazw, zadeklaruj ją tak, jak pokazano w poniższym fragmencie kodu.
<?php przestrzeń nazw Tawerna;
To, co robi ta linia kodu, to deklaracja, że wszystko w tym konkretnym pliku ma przestrzeń nazw Tavern .
Spójrz na prostą funkcję w tej przestrzeni nazw do wyprowadzania Hello, World! wiadomość.
<?php
przestrzeń nazw Tawerna;
funkcja cześć() {
_e( 'Witaj, świecie!', 'przykładowa-domena-tekstowa' );
} Jeśli przestrzegasz starych zasad prefiksów, hello() zostałoby nazwane tavern_hello() . Jednak tak nie jest w przypadku przestrzeni nazw. Funkcja hello() jest zawarta w przestrzeni nazw Tavern i nie będzie kolidować z innymi funkcjami o nazwie hello() .
Klasy i interfejsy działają tak samo jak funkcje. Z nazwą klasy Article , plik klasy może wyglądać następująco.
<?php
przestrzeń nazw Tawerna;
klasa Artykuł {
//...
}Uwaga: W każdym pliku powinna być tylko jedna klasa lub interfejs. Jest to szczególnie ważne, jeśli kiedykolwiek planujesz użyć automatycznego ładowania.
Jak nazywać przestrzenie nazw
Deweloperzy lubią kłócić się o to, jak nazywać rzeczy, i nie ma jednego uniwersalnego rozwiązania. Najważniejszą zasadą jest bycie unikalnym, aby uniknąć kolizji z kodem z innych projektów. Jednym z najlepszych sposobów na to jest użycie przestrzeni nazw Vendor najwyższego poziomu z podrzędną przestrzenią nazw Package .
Załóżmy, że przestrzeń nazw dostawcy to Tavern , a projekt, o którym mowa, to motyw WordPress o nazwie News . Przestrzeń nazw projektu może wyglądać następująco.
<?php przestrzeń nazw Tavern\News;
Dla niektórych programistów może to być nieco gadatliwe. Jeśli nazwa twojego projektu jest już dość unikalna, na przykład „Awesomesauce”, możesz po prostu użyć następującego.
<?php przestrzeń nazw Niesamowity sos;
Przynajmniej dla siebie będziesz chciał wymyślić jakąś standardową konwencję. W końcu będziesz chciał zająć się takimi rzeczami, jak automatyczne ładowanie, więc pomocne będzie posiadanie systemu, który śledzisz we wszystkich swoich projektach. Zapraszam do zapoznania się ze standardem PHP-FIG Autoloader.
Importowanie klas i funkcji do innej przestrzeni nazw
Jeśli potrzebujesz użyć klasy lub funkcji z innej przestrzeni nazw niż bieżąca przestrzeń nazw, musisz ją zaimportować. Odbywa się to za pomocą słowa kluczowego use w PHP.

Instrukcja use musi znajdować się po deklaracji namespace . Powinna również odnosić się do w pełni kwalifikowanej nazwy klasy. Poniższy kod importuje klasę Tavern\Helpers\Post do pliku o innej przestrzeni nazw.
<?php przestrzeń nazw Tawerna\Szablon; użyj Tawerna\Pomocnicy\Poczta;
Po zaimportowaniu możesz bezpiecznie używać klasy Post bezpośrednio, jak pokazano w następnym fragmencie.
$post = nowy post();
Od PHP 5.6 możesz również importować funkcje i stałe z innych przestrzeni nazw używając odpowiednio use function i use const . Poniższy blok kodu demonstruje, jak zaimportować zarówno funkcję, jak i stałą.
<?php przestrzeń nazw Tawerna\Szablon; użyj funkcji Tavern\Helpers\func_name; użyj const Tavern\Helpers\CONSTANT_NAME;
Klasy i funkcje aliasów
W końcu napotkasz sytuację, w której będziesz musiał zaimportować klasę lub funkcję, która ma taką samą nazwę jak klasa lub funkcja w bieżącej przestrzeni nazw. Być może myślisz, że jest to problem, który miały rozwiązać przestrzenie nazw. Na szczęście PHP udostępnia metodę tworzenia aliasu przy imporcie.
Załóżmy, że masz klasę o nazwie Tavern\User i musisz zaimplementować interfejs Tavern\Contracts\User . Podczas importowania interfejsu musisz utworzyć alias, jak pokazano poniżej.
<?php
przestrzeń nazw Tawerna;
użyj Tavern\Contracts\User jako UserContract;
class Użytkownik implementuje UserContract {
//...
} as UserContract dołączony na końcu instrukcji use tworzy alias dla interfejsu User . Możesz bezpiecznie używać UserContract nazwy umowy użytkownika bez błędów.
Klasy, interfejsy, funkcje i stałe używają tej samej metody tworzenia aliasu.
Organizowanie struktury folderów na podstawie przestrzeni nazw
Standardową praktyką w szerszym świecie PHP jest dopasowanie przestrzeni nazw oraz struktury plików i folderów projektu. Dzięki temu inni programiści mogą łatwo zlokalizować kod w projekcie. Ułatwia również budowanie autoloaderów do ładowania klas na żądanie.
Ogólnie, cały kod PHP powinien trafić do /src , /inc , lub folderu o podobnej nazwie w twoim projekcie. Przykładowa struktura plików i folderów wtyczki może wyglądać następująco.
/nazwa-wtyczki
/src
/Rdzeń
/Aktywuj.php
/Setup.php
/Pogląd
/Post.php
/Strona.php Jeśli podążasz za tą samą strukturą z przestrzeniami nazw, powyższe pliki .php będą zawierać następujące klasy.
-
Tavern\Core\Activate -
Tavern\Core\Setup -
Tavern\View\Post -
Tavern\View\Page
Zwróć uwagę, że w nazwach plików i folderów rozróżniana jest wielkość liter i powinny one dokładnie odpowiadać przestrzeni nazw i nazwie klasy.
Oczywiście możesz przestrzegać dowolnej konwencji. Jednak powyższe zalecenie jest dobrą praktyką i w dłuższej perspektywie uprości sposób organizowania projektów.
Korzyści z używania przestrzeni nazw
Najbardziej oczywistą korzyścią jest uniknięcie kolizji między klasami i funkcjami o tej samej nazwie. Powinieneś używać prawdziwych przestrzeni nazw z tego samego powodu, dla którego użyłeś przedrostków.
Przestrzenie nazw pomagają uniknąć długich nazw klas. Wpisywanie długich nazw w dużym projekcie jest w najlepszym wypadku żmudną praktyką.
Łatwiejsze przełączanie implementacji poprzez importowanie. Kiedy już opanujesz importowanie klas i interfejsów z innych przestrzeni nazw, możesz zmienić implementację interfejsu za pomocą jednego wiersza kodu.
Automatyczne ładowanie klas jest znacznie łatwiejsze, jeśli stosujesz standard PSR-4: Autoloader, który wymaga przynajmniej przestrzeni nazw najwyższego poziomu.
Dla programistów w przestrzeni zawodowej zyskasz umiejętność rynkową wykraczającą poza ekosystem WordPress. Trudno będzie znaleźć pracę programistyczną PHP, jeśli nie wiesz, jak używać przestrzeni nazw. Nie jest to trudna koncepcja do zrozumienia, ale w praktyce dla niektórych może być krzywa uczenia się.
