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 |