Menu
Coddy logo textTech

Standard autoloadingu PSR-4

Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 12 z 91.

PSR-4 to standard określający, jak klasy PHP powinny być automatycznie ładowane na podstawie ich przestrzeni nazw i lokalizacji plików. Zamiast ręcznie dołączać plik każdej klasy, PSR-4 pozwala PHP automatycznie znajdować i ładować klasy, gdy ich używasz.

Podstawowa zasada jest prosta: przestrzeń nazw musi odpowiadać strukturze katalogów. Jeśli masz klasę App\Models\User, plik powinien znajdować się w App/Models/User.php.

<?php
// Plik: src/Models/User.php
namespace App\Models;

class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

Możesz napisać prostą funkcję automatycznego ładowania, która przestrzega reguł PSR-4:

<?php
// Plik: autoload.php
spl_autoload_register(function ($class) {
    $prefix = 'App\\';
    $baseDir = __DIR__ . '/src/';
    
    // Sprawdź, czy klasa używa naszego prefiksu przestrzeni nazw
    if (strpos($class, $prefix) === 0) {
        $relativeClass = substr($class, strlen($prefix));
        $file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
        
        if (file_exists($file)) {
            require $file;
        }
    }
});

Funkcja spl_autoload_register informuje PHP, aby wywoływał Twoją funkcję zawsze, gdy napotka nieznaną klasę. Funkcja przekształca przestrzeń nazw na ścieżkę do pliku i go wczytuje.

Najważniejsza kwestia: PSR-4 tworzy przewidywalne mapowanie między przestrzeniami nazw a ścieżkami plików. Gdy widzisz App\Models\User, od razu wiesz, że plik znajduje się w src/Models/User.php. Ta konwencja ułatwia nawigację po projektach i ich utrzymanie.

challenge icon

Wyzwanie

Łatwy

Zbudujmy prosty system automatycznego ładowania PSR-4, który automatycznie ładuje klasy na podstawie ich przestrzeni nazw i lokalizacji plików.

Utworzysz projekt z trzema plikami, które pokażą, jak PSR-4 mapuje przestrzenie nazw na ścieżki katalogów:

  • src/Services/Logger.php: Zdefiniuj klasę Logger w przestrzeni nazw App\Services. Powinna mieć właściwość public $name, konstruktor, który przyjmuje i ustawia nazwę, oraz metodę log($message), która zwraca "[name] logged: [message]".
  • src/Services/Mailer.php: Zdefiniuj klasę Mailer w przestrzeni nazw App\Services. Powinna mieć właściwość public $sender, konstruktor, który przyjmuje i ustawia nadawcę, oraz metodę send($to), która zwraca "Mail from [sender] to [to]".
  • main.php: Utwórz autoloader PSR-4 za pomocą spl_autoload_register, który mapuje prefiks przestrzeni nazw App\ na katalog src/. Autoloader powinien zamienić separatory przestrzeni nazw na separatory katalogów i dodać .php, aby znaleźć właściwy plik. Po zarejestrowaniu autoloadera użyj słowa kluczowego use, aby zaimportować obie klasy, a następnie utwórz obiekt Logger z nazwą "FileLogger" i obiekt Mailer z nadawcą "admin@site.com". Wyświetl wynik wywołania log("System started") dla loggera i send("user@example.com") dla mailera (każdy w osobnym wierszu).

Kluczowa wskazówka jest taka, że funkcja autoloadera otrzymuje w pełni kwalifikowaną nazwę klasy (na przykład App\Services\Logger) i musi zamienić ją na ścieżkę do pliku (src/Services/Logger.php). Użyj strpos, aby sprawdzić, czy nazwa klasy zaczyna się od prefiksu przestrzeni nazw, substr, aby uzyskać nazwę klasy względną, oraz str_replace, aby zamienić ukośniki odwrotne na ukośniki proste.

Spróbuj swoich sił

<?php
// Implementacja automatycznego ładowania klas zgodna z PSR-4

// TODO: Zarejestruj funkcję automatycznego ładowania klas za pomocą spl_autoload_register
// Funkcja automatycznego ładowania klas powinna:
// 1. Sprawdzić, czy nazwa klasy zaczyna się od prefiksu przestrzeni nazw 'App\'
// 2. Usunąć prefiks 'App\', aby uzyskać względną nazwę klasy
// 3. Zamienić separatory przestrzeni nazw (\) na separatory katalogów (/)
// 4. Dodać 'src/' na początku i '.php' na końcu, aby utworzyć ścieżkę do pliku
// 5. Dołączyć plik, jeśli istnieje

spl_autoload_register(function ($class) {
    // TODO: Zdefiniuj prefiks przestrzeni nazw i katalog bazowy
    
    // TODO: Sprawdź, czy nazwa klasy używa prefiksu przestrzeni nazw (użyj strpos)
    
    // TODO: Uzyskaj względną nazwę klasy (użyj substr)
    
    // TODO: Utwórz ścieżkę do pliku, zamieniając \ na / (użyj str_replace)
    
    // TODO: Dołącz plik, jeśli istnieje
});

// TODO: Użyj słowa kluczowego 'use', aby zaimportować klasy Logger i Mailer

// TODO: Utwórz instancję Logger o nazwie "FileLogger"

// TODO: Utwórz instancję Mailer z nadawcą "admin@site.com"

// TODO: Wyświetl wynik log("System started")

// TODO: Wyświetl wynik send("user@example.com")
?>
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