Les interfaces en PHP
#1 Comment déclarer une interface ?
Pour déclarer une interface, vous devez procéder comme avec une classe, sauf qu'il faut utiliser le mot réservé interface
à la place de class
.
Si vous voulez respecter les PSRs, vous devez inclure le sufixe Interface
dans le nom de l'interface.
Vous pouvez déclarer uniquement des constantes et des signatures de méthodes publiques dans l'interface. Ceci comprend éventuellement des signatures de méthodes magiques comme le constructeur.
Ci-dessous, je déclare l'interface DataInterface
. Je déclare une constante et une méthode publique.
#2 Comment utiliser une interface ?
Pour utiliser une interface, vous devez passer par une classe qui va implémenter l'interface. Pour implémenter l'interface, la classe doit reprendre l'intégralité des signatures et les implémenter.
Ci-dessous, je déclare que la classe DataFile
implémente l'interface DataInterface
et je code le corps de la signature getData
.
#3 Comment respecter les signatures ?
La classe doit respecter la signature. Ca veut dire qu'elle doit respecter :
- La visibilité.
- La liste des paramètres (obligatoires ou optionnels) avec leur type. Le nom d'un paramètre peut être différent (pas conseillé du tout).
- S'il y a une valeur par défaut dans l'interface, alors la classe doit en avoir une. Elle peut être différente.
- Le type de la valeur de retour.
#4 Une classe peut implémenter une interface et hériter d'une classe
Le fait qu'une classe implémente une interface ne l'empêche pas de pouvoir étendre une classe mère. La classe héritera donc des implémentations qui se trouvent dans la classe mère et des spécifications qui se trouvent dans l'interface.
Attention, on ne peut pas pour autant parler d'héritage multiple, car l'héritage multiple consiste à hériter de plusieurs classes.
Ci-dessous, je déclare une classe CommunDataFile
. Puis je déclare que DataFile
étend CommunDataFile
et implémente DataInterface
.
#5 Une classe peut implémenter plusieurs interfaces
Une classe peut aussi implémenter plusieurs interfaces.
Ci-dessous, je déclare l'interface ConfInterface
. Ensuite, je déclare que la classe DataFile
implémente deux interfaces, soit DataInterface
et ConfInterface
.
#6 Une interface peut étendre une ou plusieurs autres interfaces
Vous pouvez, en PHP, déclarer qu'une interface étend une ou plusieurs autres interfaces. Un héritage multiple est donc possible au niveau des interfaces ( seulement au niveau des interfaces ).
#7 Une interface peut être implémentée par plusieurs classes
Regardez ce que l'on peut faire avec cette possibilité 😀. Ci-dessous, j'ai déclaré une interface DataInterface
. Elle est implémentée de manière différente par deux classes DataFile
et DataBase
. DataFile
va chercher les données sur fichier. DataBase
va chercher les données en database.
Ensuite, je crée une classe PoserQuestion
qui a besoin qu'on lui injecte une interface. Je le spécifie dans le constructeur de PoserQuestion
en mettant un argument de type DataInterface
. Je peux, grâce aux interfaces, injecter (* dynamiquement si besoin) soit l'implémentation DataFile
soit l'implémentation DataBase
de DataInterface
😉.