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 |