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:

  1. 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. Klasy Dog i Cat implementują ten interfejs, zwracając odpowiednio “Woof!” i “Meow!”. Funkcja getAnimalSound() przyjmuje obiekt implementujący AnimalSound i zwraca jego dźwięk.

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

Dodaj komentarz 0

Your email address will not be published. Required fields are marked *