Interfejsy a typy wariantne
Założenie: Zrozumieć, jak wykorzystać kowariancję i kontrawariancję w interfejsach PHP, aby umożliwić elastyczne operacje na różnych typach danych.
Krok po kroku:
- Definicja interfejsu z typem wariantnym (kowariancja): Użyjemy słowa kluczowego `
makeSound(); } $dog = new Dog(); $cat = new Cat(); echo getAnimalSound($dog) . "\n"; // Wyświetli "Woof!" echo getAnimalSound($cat) . "\n"; // Wyświetli "Meow!" ?>
W tym przykładzie interfejs
AnimalSound
deklaruje metodęmakeSound()
, która zwraca string. KlasyDog
iCat
implementują ten interfejs, zwracając odpowiednio “Woof!” i “Meow!”. FunkcjagetAnimalSound()
przyjmuje obiekt implementującyAnimalSound
i zwraca jego dźwięk. - Przykład kontrawariancji (parametr metody): Kontrawariancja odnosi się do parametrów metody. Typ parametru może być supertypem zadeklarowanego typu. Należy jednak pamiętać, że kontrawariancja w PHP jest ograniczona i wymaga użycia typów generycznych (dostępnych od PHP 7.4).
handle(new Animal()); // Z typami generycznymi (PHP 7.4+) interface AnimalHandlerGeneric
{ public function handle(T $animal): void; } class DogHandlerGeneric implements AnimalHandlerGeneric { public function handle(Dog $dog): void { echo "Handling dog\n"; } } $dogHandlerGeneric = new DogHandlerGeneric(); $dogHandlerGeneric->handle(new Dog()); // Działa poprawnie ?> Ten przykład pokazuje, jak kontrawariancja pozwala na użycie bardziej specyficznego typu w parametrze metody. Bez typów generycznych,
DogHandler
nie mógłby obsługiwaćAnimal
. Z typami generycznymi, możemy precyzyjnie określić, jaki typ ma być obsługiwany.
Podsumowanie: Ten przykład pokazuje podstawowe zastosowanie kowariancji i kontrawariancji w interfejsach PHP. Pozwala to na tworzenie bardziej elastycznego i skalowalnego kodu. Zachęcamy do dalszego zgłębiania tematu typów wariantnych w PHP, aby w pełni wykorzystać ich możliwości.