Sobes.tech
Junior

Ce sunt interfețele în PHP?

sobes.tech AI

Răspuns de la AI

Interfața în PHP este un contract care descrie un set de metode (cu semnăturile lor) pe care o clasă trebuie să le implementeze. Ea definește "ce" face clasa, dar nu "cum".

  • Contract: Clasa care implementează interfața se angajează să furnizeze toate metodele descrise în ea, cu aceleași nume, parametri și tipuri de returnare.
  • Moștenirea de tipuri: Interfețele permit definirea tipurilor bazate pe comportament, nu doar pe ierarhia claselor. Acest lucru este util pentru polimorfism. Poți lucra cu obiecte din clase diferite care implementează aceeași interfață, ca și cum ar fi de același tip.
  • Moștenirea multiplă de comportament: PHP nu suportă moștenirea multiplă a claselor, dar o clasă poate implementa mai multe interfețe. Acest lucru permite unei clase să aibă comportamente din mai multe contracte.
  • Separarea responsabilităților: Interfețele ajută la separarea definirii comportamentului de implementarea sa.
<?php

// Definirea interfeței
interface Logger
{
    /**
     * Înregistrează un mesaj.
     * @param string $message Mesajul de înregistrat.
     */
    public function log(string $message): void;
}

// Clasă care implementează interfața
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);
    }
}

// Altă clasă care implementează aceeași interfață
class DatabaseLogger implements Logger
{
    private $dbConnection; // Se presupune un obiect de conexiune la bază de date

    public function __construct($dbConnection)
    {
        $this->dbConnection = $dbConnection;
    }

    public function log(string $message): void
    {
        // Logica de salvare în bază de date
        // ...
        echo "Înregistrare în bază de date: " . $message . PHP_EOL;
    }
}

// Utilizarea interfeței pentru a lucra cu diferite implementări
function processData(Logger $logger, string $data): void
{
    // Procesarea datelor
    // ...
    $logger->log("Date procesate: " . $data);
}

$fileLogger = new FileLogger('/var/log/app.log');
$dbLogger = new DatabaseLogger(null); // Mock pentru exemplu de conexiune la bază de date

processData($fileLogger, 'Exemplu de date 1');
processData($dbLogger, 'Exemplu de date 2');

Principalele diferențe față de clasele abstracte:

Caracteristică Interfață Clasă abstractă
Tipul membrilor Doar metode (trebuie să fie publice) Metode (publice, protected), proprietăți
Implementarea metodelor Fără implementare (doar semnături) Poate conține metode implementate
Moștenire O clasă poate implementa mai multe interfețe O clasă poate moșteni doar o clasă abstractă
Constructor Nu are Poate avea un constructor
Membri cu vizibilitate Doar public public, protected