Si une classe abstraite sert à factoriser les traitements, une interface sert à en imposer la structure : elle permet d’imposer aux classes l’implémentant la définition de méthodes prédéfinies.
L’interface diffère d’une classe abstraite sur de nombreux points :
- On ne peut pas hériter une interface
- Une interface ne peut pas contenir de code utile
- Une interface ne comporte pas de notion de visibilité
- Une interface ne peut pas déclarer d’attributs ni de méthodes statiques
De plus, une classe peut très bien implémenter plusieurs interfaces. Une interface est capable d’hériter d’une ou plusieurs interfaces.
Exemple
<?php interface Usine { } class Voiture implements Usine { }
Constantes
Une interface peut posséder des constantes d’interfaces, elles diffèrent des constantes de classes dans le sens où on ne peut pas les redéfinir ni dans les classes qui l’implémentent ni dans les interfaces qui en héritent
Méthodes
Une méthode déclarée dans une interface n’a ni visibilité ni corps. C’est une signature de méthode qui impose aux classes l’implémentant de définir cette méthode en respectant la signature associée. Il est possible de modifier la signature en ajoutant des paramètres optionnels
Exemple d’utilisation
<?php interface Usine { function demarrer(); function arreter(); function alimenter($param1); } class Voiture implements Usine { function demarrer(){ echo __METHOD__; } function arreter(){ echo __METHOD__; } public function alimenter($p1, $p2 = null){ echo __METHOD__; } } $v1 = new Voiture(); $v1->demarrer(); // affiche Voiture::demarrer
Une méthode d’interface étant implicitement ou explicitement publique, elle doit être nécessairement définie en tant que publique dans la classe implémentant.