Menu
Coddy logo textTech

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).

challenge icon

Wyzwanie

Łatwy

Zorganizujmy 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ę Car w przestrzeni nazw Vehicle z 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ę Car w przestrzeni nazw Animal (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łania describe() dla każdego obiektu (każdy w osobnym wierszu).

W pliku main.php utwórz:

  • Vehicle\Car z marką "Toyota"
  • Animal\Car w wieku 3

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)

?>
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator PHP online