Klasy anonimowe
Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 58 z 91.
Czasami potrzebujesz prostego, jednorazowego obiektu bez narzutu związanego z definiowaniem pełnej klasy. Klasy anonimowe pozwalają tworzyć obiekty na bieżąco, dokładnie tam, gdzie ich potrzebujesz. Są szczególnie przydatne w połączeniu z wstrzykiwaniem zależności.
Klasa anonimowa jest definiowana za pomocą new class, po którym następuje treść klasy:
<?php
$logger = new class {
public function log(string $message): void {
echo "Log: $message";
}
};
$logger->log("Hello!");
Wynik:
Log: Hello!Klasy anonimowe stają się potężne, gdy implementują interfejsy. To idealne rozwiązanie do testowania lub gdy potrzebujesz szybkiej implementacji bez zaśmiecania bazy kodu klasami używanymi tylko raz:
<?php
interface Notifier {
public function send(string $message): string;
}
function notify(Notifier $notifier, string $msg): string {
return $notifier->send($msg);
}
$result = notify(new class implements Notifier {
public function send(string $message): string {
return "Sent: $message";
}
}, "Test message");
echo $result;
Wynik:
Sent: Test messageKlasy anonimowe mogą również rozszerzać inne klasy, używać traitów i przyjmować argumenty konstruktora. Mają pełny dostęp do funkcji OOP — są po prostu definiowane w miejscu użycia, a nie w osobnym pliku. Używaj ich, gdy pełna definicja klasy byłaby przesadą, ale nadal potrzebujesz zachowania obiektowego.
Wyzwanie
ŁatwyZbudujmy system formatowania danych, który pokaże możliwości klas anonimowych. Zamiast tworzyć osobne pliki klas dla prostych, jednorazowych implementacji, użyjesz klas anonimowych, aby szybko tworzyć implementacje dokładnie tam, gdzie ich potrzebujesz.
Rozmieścisz kod w dwóch plikach:
FormatterInterface.php: Zdefiniuj interfejs o nazwieFormatterInterfacez jedną metodąformat(string $data): string. Określa ona kontrakt, którego musi przestrzegać każdy formater.main.php: Dołącz plik interfejsu i utwórz klasęDataProcessor, która używa wstrzykiwania zależności, aby przyjmować dowolny formater. Klasa powinna:- Przyjmować
FormatterInterfacew konstruktorze - Mieć metodę
process(string $data), która przekazuje zadanie wstrzykniętemu formaterowi i zwraca wynik
Otrzymasz dwa dane wejściowe: typ formatowania (
"upper"lub"reverse") oraz ciąg znaków do sformatowania.W zależności od typu formatowania utwórz klasę anonimową implementującą
FormatterInterface:- Dla
"upper": metodaformat()powinna zwracać dane zamienione na wielkie litery - Dla
"reverse": metodaformat()powinna zwracać odwrócone dane
Wstrzyknij klasę anonimową do obiektu
DataProcessor, wywołajprocess()z wejściowym ciągiem znaków i wypisz wynik.- Przyjmować
To podejście sprawdza się doskonale, gdy potrzebujesz szybkiej implementacji bez zaśmiecania bazy kodu plikami klas używanymi tylko raz. Klasa anonimowa jest tworzona bezpośrednio w miejscu użycia, implementuje wymagany interfejs i można ją przekazać wszędzie tam, gdzie oczekiwany jest ten interfejs.
Spróbuj swoich sił
<?php
require_once 'FormatterInterface.php';
// TODO: Utwórz klasę DataProcessor, która:
// - Przyjmuje FormatterInterface w konstruktorze
// - Ma metodę process(string $data), która deleguje zadanie do formatera
// Odczytaj dane wejściowe
$formatType = trim(fgets(STDIN));
$inputString = trim(fgets(STDIN));
// TODO: Na podstawie $formatType ("upper" lub "reverse") utwórz klasę anonimową
// która implementuje FormatterInterface
// - Dla "upper": format() powinna zwracać dane zapisane wielkimi literami
// - Dla "reverse": format() powinna zwracać dane w odwróconej kolejności
// TODO: Utwórz DataProcessor z formatowaniem realizowanym przez klasę anonimową
// Wywołaj process() z ciągiem wejściowym i wypisz wynik
?>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ów10Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieWstrzykiwanie zależnościKlasy anonimoweEnumy (PHP 8.1)Włókna (PHP 8.1)Dogłębne omówienie klonowania obiektówGeneratory i iteratory2Przestrzenie 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