Wprowadzenie do przestrzeni nazw
Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 10 z 91.
W miarę rozwoju projektów PHP będziesz tworzyć wiele klas. Co się stanie, jeśli dwie klasy będą miały tę samą nazwę?
Na przykład możesz mieć klasę User na potrzeby swojego bloga i inną klasę User na potrzeby swojego sklepu. Przestrzenie nazw rozwiązują ten problem, porządkując klasy w logiczne grupy.
Przestrzeń nazw jest jak folder na twoje klasy. Deklarujesz ją na początku pliku PHP za pomocą słowa kluczowego namespace:
<?php
namespace Blog;
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
Teraz możesz mieć kolejną klasę User w innej przestrzeni nazw:
<?php
namespace Shop;
class User {
public $email;
public function __construct($email) {
$this->email = $email;
}
}
Aby użyć klasy z przestrzeni nazw, odwołujesz się do niej, podając pełną ścieżkę z ukośnikami odwrotnymi:
<?php
$blogUser = new \Blog\User("Alice");
$shopUser = new \Shop\User("alice@example.com");
echo $blogUser->name . "\n";
echo $shopUser->email . "\n";
Wynik:
Alice
alice@example.com
Ukośnik odwrotny \ oddziela poziomy przestrzeni nazw, podobnie jak ukośniki oddzielają foldery w ścieżce pliku. Możesz też tworzyć zagnieżdżone przestrzenie nazw, takie jak App\Models\Blog, aby lepiej organizować kod.
Kluczowa kwestia: Przestrzenie nazw zapobiegają konfliktom nazw i pomagają utrzymać porządek w kodzie. Zawsze deklaruj przestrzeń nazw przed innym kodem w pliku (z wyjątkiem instrukcji declare).
Wyzwanie
ŁatwyZorganizujmy małą aplikację, używając przestrzeni nazw, aby zapobiec konfliktom nazw między klasami o tej samej nazwie.
Wyobraź sobie, że tworzysz system obsługujący zarówno pojazdy, jak i zwierzęta. W obu tych dziedzinach występuje encja o nazwie Car: jedna reprezentuje prawdziwy samochód, a druga to kot domowy o imieniu "Car" (tak, niektórzy tak nazywają swoje koty!).
Utworzysz trzy pliki:
Vehicle/Car.php: Zdefiniuj klasęCarw przestrzeni nazwVehiclez właściwościąpublic $brand. Konstruktor powinien przyjmować nazwę marki i ją ustawiać. Dodaj metodędescribe(), która zwraca"Vehicle: [brand]".Animal/Car.php: Zdefiniuj klasęCarw przestrzeni nazwAnimal(to kot o imieniu Car!). Powinna mieć właściwośćpublic $age. Konstruktor przyjmuje wiek i go ustawia. Dodaj metodędescribe(), która zwraca"Cat named Car, age: [age]".main.php: Dołącz oba pliki klas za pomocąrequire_once. Utwórz po jednym obiekcie z każdej przestrzeni nazw, używając pełnych ścieżek przestrzeni nazw, a następnie wypisz wynik wywołaniadescribe()dla każdego obiektu (każdy w osobnym wierszu).
W pliku main.php utwórz:
Vehicle\Carz marką"Toyota"Animal\Carw wieku3
Pamiętaj, aby użyć ukośnika odwrotnego \, by podczas tworzenia obiektów odwołać się do klas w przestrzeni nazw za pomocą ich pełnej ścieżki.
Spróbuj swoich sił
<?php
// Dołącz pliki klas
require_once 'Vehicle/Car.php';
require_once 'Animal/Car.php';
// TODO: Utwórz obiekt Vehicle\Car z marką "Toyota"
// Pamiętaj, aby użyć pełnej ścieżki przestrzeni nazw z ukośnikiem odwrotnym
// TODO: Utwórz obiekt Animal\Car w wieku 3 lat
// Pamiętaj, aby użyć pełnej ścieżki przestrzeni nazw z ukośnikiem odwrotnym
// TODO: Wypisz wynik describe() dla każdego obiektu (każdy w osobnym wierszu)
?>Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe $thisMetodyWłaściwościKonstruktor (__construct)Destruktor (__destruct)Powtórka — prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe parent::Przesłanianie metodSłowo kluczowe finalKlasy abstrakcyjnePowtórzenie – hierarchia pracowników7Enkapsulacja
Public, protected, privateModyfikatory dostępu w szczegółachGettery i setteryUkrywanie informacjiPromocja parametrów konstruktora (8.0)Podsumowanie — system ewidencji studentów2Przestrzenie nazw i autoloading
Wprowadzenie do przestrzeni nazwSłowo kluczowe useStandard autoloadingu PSR-4Autoloader ComposeraPodsumowanie – uporządkowany projekt5Interfejsy i kontrakty
Wprowadzenie do interfejsówImplementowanie interfejsówImplementowanie wielu interfejsówInterfejs a klasa abstrakcyjnaPodpowiadanie typów za pomocą interfejsówPodsumowanie — kalkulator kształtów8Metody magiczne
Wprowadzenie do metod magicznych__toString i __debugInfo__get, __set, __isset, __unset__call i __callStatic__clone i klonowanie obiektów__serialize i __unserializePodsumowanie — własna kolekcja11System typów i obsługa błędów
Deklaracje typówTypy nullableTypy sumy i przecięciaKlasy wyjątkówNiestandardowa hierarchia wyjątkówTry, Catch, FinallyPodsumowanie — walidator formularzy14Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Właściwości klas
Właściwości instancji a właściwości statyczneStałe w klasachMetody i właściwości statyczneWłaściwości prywatne i chronioneWłaściwości tylko do odczytu (PHP 8.1)Podsumowanie — menedżer kont bankowych6Polimorfizm
Ponowne omówienie nadpisywania metodPolimorfizm za pomocą interfejsówPodpowiedzi typów i typy sumyPóźne wiązanie statycznePodsumowanie — procesor płatności9Cechy
Wprowadzenie do cechKorzystanie z wielu cechRozwiązywanie konfliktów cechMetody abstrakcyjne w cechachCechy a dziedziczenie12Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator PHP online