Junior
Czym są interfejsy w PHP?
sobes.tech AI
Odpowiedź od AI
Interfejs w PHP to kontrakt opisujący zestaw metod (z ich sygnaturami), które musi zaimplementować klasa. Określa "co" klasa robi, ale nie "jak".
- Kontrakt: Klasa implementująca interfejs zobowiązuje się do dostarczenia wszystkich metod opisanych w nim, z tymi samymi nazwami, parametrami i typami zwracanych wartości.
- Dziedziczenie typów: Interfejsy pozwalają na definiowanie typów na podstawie zachowania, a nie tylko hierarchii klas. To jest przydatne dla polimorfizmu. Możesz pracować z obiektami różnych klas, które implementują ten sam interfejs, jakby były tego samego typu.
- Wielodziedziczenie zachowania: PHP nie obsługuje wielodziedziczenia klas, ale klasa może implementować wiele interfejsów. To pozwala klasie mieć zachowania z różnych kontraktów.
- Oddzielenie odpowiedzialności: Interfejsy pomagają oddzielić definicję zachowania od jego implementacji.
<?php
// Definicja interfejsu
interface Logger
{
/**
* Zapisuje wiadomość logu.
* @param string $message Wiadomość do zapisania.
*/
public function log(string $message): void;
}
// Klasa implementująca interfejs
class FileLogger implements Logger
{
private string $filePath;
public function __construct(string $filePath)
{
$this->filePath = $filePath;
}
public function log(string $message): void
{
file_put_contents($this->filePath, $message . PHP_EOL, FILE_APPEND);
}
}
// Inna klasa implementująca ten sam interfejs
class DatabaseLogger implements Logger
{
private $dbConnection; // Zakłada się obiekt połączenia z bazą danych
public function __construct($dbConnection)
{
$this->dbConnection = $dbConnection;
}
public function log(string $message): void
{
// Logika zapisu do bazy danych
// ...
echo "Logowanie do bazy danych: " . $message . PHP_EOL;
}
}
// Użycie interfejsu do pracy z różnymi implementacjami
function processData(Logger $logger, string $data): void
{
// Przetwarzanie danych
// ...
$logger->log("Przetworzone dane: " . $data);
}
$fileLogger = new FileLogger('/var/log/app.log');
$dbLogger = new DatabaseLogger(null); // Mock dla przykładu połączenia z bazą danych
processData($fileLogger, 'Przykład danych 1');
processData($dbLogger, 'Przykład danych 2');
Główne różnice w stosunku do klas abstrakcyjnych:
| Cecha | Interfejs | Klasa abstrakcyjna |
|---|---|---|
| Typ członków | Tylko metody (muszą być publiczne) | Metody (publiczne, chronione), właściwości |
| Implementacja metod | Brak implementacji (tylko sygnatury) | Może zawierać zaimplementowane metody |
| Dziedziczenie | Klasa może implementować wiele interfejsów | Klasa może dziedziczyć tylko po jednej klasie abstrakcyjnej |
| Konstruktor | Nie istnieje | Może mieć konstruktor |
| Członkowie z widocznością | Tylko public |
public, protected |