PHP 8.2 - sprawdź co nowego!

Programowanie obiektowe > Lekcja 8

Interfejsy

Interfejsy służą nam do określenia, jakie metody muszą zostać zaimplementowane (stworzone) w klasie. Jest to więc mechanizm trochę podobny do klas abstrakcyjnych, z tą różnicą, że interfejs może zawierać jedynie deklaracje metod, bez ich ciał. Deklarujemy go podobnie jak klasę, lecz przy użyciu słowa kluczowego interface.

<?php

interface PersonInterface
{
    public function getName(): string;
    
    public function getAddress(): string;
}

Z kolei, aby zaimplementować taki interfejs dla danej klasy, używamy implements.

<?php

class Person implements PersonInterface
{
    public function getName(): string
    {
        return 'Jan Kowalski';
    }

    public function getAddress(): string
    {
        return 'Długa 1, Warszawa';
    }
}

Oczywiście każda metoda musi zgadzać się z jej deklaracją. W innym przypadku otrzymamy odpowiedni błąd, na przykład:

Fatal error: Declaration of Person::getName() must be compatible with PersonInterface::getName(): string in ...

Warto wspomnieć, że możemy implementować wiele interfejsów dla jednej klasy. Jest to pewna przewaga w stosunku klas abstrakcyjnych, gdzie możemy odziedziczyć tylko jedną klasę.

<?php

interface PersonInterface
{
    public function getName(): string;
    
    public function getAddress(): string;
}

interface UserInterface
{
    public function getLogin(): string;
}

class Person implements PersonInterface, UserInterface
{
    public function getName(): string
    {
        return 'Jan Kowalski';
    }

    public function getAddress(): string
    {
        return 'Długa 1, Warszawa';
    }

    public function getLogin(): string
    {
        return 'jkowalski';
    }
}

Dziedziczenie

Znasz już mechanizm dziedziczenia. Podobnie jak klasy, tak interfejsy mogą dziedziczyć po sobie.

<?php

interface PersonInterface
{
    public function getName(): string;
    
    public function getAddress(): string;
}

interface UserInterface extends PersonInterface
{
    public function getName(): string;
    
    public function getLogin(): string;
}

class Person implements UserInterface
{
    public function getName(): string
    {
        return 'Jan Kowalski';
    }

    public function getAddress(): string
    {
        return 'Długa 1, Warszawa';
    }

    public function getLogin(): string
    {
        return 'jkowalski';
    }
}

W takim przypadku deklaracja metody getName() jest nadpisywana.

Poprzednia lekcja Następna lekcja

Udostępnij

  • Facebook
  • Twitter

Komentarze