Sobes.tech
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