Junior
Qu'est-ce que les interfaces en PHP?
sobes.tech IA
Réponse de l'IA
L'interface en PHP est un contrat qui décrit un ensemble de méthodes (avec leurs signatures) qu'une classe doit implémenter. Elle définit "ce" que la classe fait, mais pas "comment".
- Contrat : La classe qui implémente l'interface s'engage à fournir toutes les méthodes décrites, avec les mêmes noms, paramètres et types de retour.
- Héritage de types : Les interfaces permettent de définir des types basés sur le comportement, et pas seulement sur la hiérarchie des classes. Cela est utile pour le polymorphisme. Vous pouvez travailler avec des objets de différentes classes qui implémentent une même interface, comme s'ils étaient du même type.
- Héritage multiple de comportement : PHP ne supporte pas l'héritage multiple de classes, mais une classe peut implémenter plusieurs interfaces. Cela permet à une classe d'avoir des comportements issus de plusieurs contrats.
- Séparation des responsabilités : Les interfaces aident à séparer la définition du comportement de sa mise en œuvre.
<?php
// Définition de l'interface
interface Logger
{
/**
* Enregistre un message de log.
* @param string $message Message à enregistrer.
*/
public function log(string $message): void;
}
// Classe qui implémente l'interface
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);
}
}
// Une autre classe qui implémente la même interface
class DatabaseLogger implements Logger
{
private $dbConnection; // On suppose un objet de connexion à la base de données
public function __construct($dbConnection)
{
$this->dbConnection = $dbConnection;
}
public function log(string $message): void
{
// Logique pour sauvegarder dans la base de données
// ...
echo "Enregistrement dans la base de données : " . $message . PHP_EOL;
}
}
// Utilisation de l'interface pour travailler avec différentes implémentations
function processData(Logger $logger, string $data): void
{
// Traitement des données
// ...
$logger->log("Données traitées : " . $data);
}
$fileLogger = new FileLogger('/var/log/app.log');
$dbLogger = new DatabaseLogger(null); // Mock pour exemple de connexion à la BD
processData($fileLogger, 'Exemple de données 1');
processData($dbLogger, 'Exemple de données 2');
Principales différences avec les classes abstraites :
| Caractéristique | Interface | Classe abstraite |
|---|---|---|
| Type de membres | Seulement des méthodes (doivent être publiques) | Méthodes (publiques, protégées), propriétés |
| Implémentation des méthodes | Pas d'implémentation (seules signatures) | Peut contenir des méthodes implémentées |
| Héritage | Une classe peut implémenter plusieurs interfaces | Une classe peut hériter d'une seule classe abstraite |
| Constructeur | N'existe pas | Peut avoir un constructeur |
| Membres avec visibilité | Seulement public |
public, protected |