Programowanie obiektowe > Lekcja 8
Interfejsy
Ostatnia modyfikacja: 01.06.2021
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.
Komentarze