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.
Wyzwanie
ŁatwyZbudujmy 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ęLoggerw przestrzeni nazwApp\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ęMailerw przestrzeni nazwApp\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 nazwApp\na katalogsrc/. 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 kluczowegouse, aby zaimportować obie klasy, a następnie utwórz obiektLoggerz nazwą"FileLogger"i obiektMailerz nadawcą"admin@site.com". Wyświetl wynik wywołanialog("System started")dla loggera isend("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")
?>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