Sobes.tech
Junior

Cosa sono le interfacce in PHP?

sobes.tech AI

Risposta dell'AI

L'interfaccia in PHP è un contratto che descrive un insieme di metodi (con le loro firme) che una classe deve implementare. Essa definisce "cosa" fa la classe, ma non "come".

  • Contratto: La classe che implementa l'interfaccia si impegna a fornire tutti i metodi descritti, con gli stessi nomi, parametri e tipi di ritorno.
  • Ereditarietà di tipi: Le interfacce permettono di definire tipi basati sul comportamento, non solo sulla gerarchia delle classi. Questo è utile per il polimorfismo. Puoi lavorare con oggetti di classi diverse che implementano la stessa interfaccia, come se fossero dello stesso tipo.
  • Ereditarietà multipla di comportamento: PHP non supporta l'ereditarietà multipla di classi, ma una classe può implementare più interfacce. Questo permette a una classe di avere comportamenti di più contratti.
  • Separazione delle responsabilità: Le interfacce aiutano a separare la definizione del comportamento dalla sua implementazione.
<?php

// Definizione dell'interfaccia
interface Logger
{
    /**
     * Registra un messaggio di log.
     * @param string $message Messaggio da registrare.
     */
    public function log(string $message): void;
}

// Classe che implementa l'interfaccia
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);
    }
}

// Un'altra classe che implementa la stessa interfaccia
class DatabaseLogger implements Logger
{
    private $dbConnection; // Si assume un oggetto di connessione al database

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

    public function log(string $message): void
    {
        // Logica di salvataggio nel database
        // ...
        echo "Registrazione nel database: " . $message . PHP_EOL;
    }
}

// Uso dell'interfaccia per lavorare con diverse implementazioni
function processData(Logger $logger, string $data): void
{
    // Elaborazione dei dati
    // ...
    $logger->log("Dati elaborati: " . $data);
}

$fileLogger = new FileLogger('/var/log/app.log');
$dbLogger = new DatabaseLogger(null); // Mock per esempio di connessione al database

processData($fileLogger, 'Esempio di dati 1');
processData($dbLogger, 'Esempio di dati 2');

Principali differenze con le classi astratte:

Caratteristica Interfaccia Classe astratta
Tipo di membri Solo metodi (devono essere pubblici) Metodi (pubblici, protetti), proprietà
Implementazione dei metodi Nessuna implementazione (solo firme) Può contenere metodi implementati
Ereditarietà Una classe può implementare più interfacce Una classe può ereditare solo da una classe astratta
Costruttore Non presente Può avere un costruttore
Membri con visibilità Solo public public, protected