Interfaces PHP
Quand on crée une classe, rien ne nous oblige à déclarer telle ou telle méthode. Nous sommes libres de déclarer ce qu'on veut avec les noms que l'on veut (tant qu'ils respectent les spécifications décrites en PHP). Cependant, il est parfois utile de dicter sa conduite à une classe particulière. Autrement dit, cette classe doit impérativement contenir une ou plusieurs méthodes avec les visibilités et les noms souhaités. Afin de parvenir à ceci, on recourt aux
interfaces.
Une interface: une classe entièrement abstraite
Une interface se comporte comme une classe abstraite dont toutes les méthodes sont abstraites. Cependant l'ultime différence entre une classe abstraite et une interface est que les classes qui vont hériter des classes abstraites constituent des sous familles de la classe mère, par contre une interface peut être utilisées par des classes dont les finalités ne sont pas forcément semblables.
Pour mieux comprendre le principe, supposons que nous avons une classe abstraite du nom de
Vehicule. Les classes Filles qui peuvent en hériter sont par exemple
Voiture,
Camion et
Fourgon. Ces classes sont en réalité des véhicules plus ou moins différents, donc ils constituent un sous ensemble de la classe
Vehicule. Par contre les classes
Vehicule et
Maison ne sont pas de la même famille. Néanmoins chacune d'entre elles peut accueillir une méthode du nom de
peindre(). C'est là où une interface qui renferme la méthode
peindre() peut être utile.
Définir une interface
Pour définir une interface, on utilise le mot clé
interface suivi du nom de celle-ci (avec une première lettre majuscule de préférence, tout comme pour une classe) suivi des accolades qui renfermeront les membres de l'interface comme ceci:
<?php
interface Entretien{
public function peindre($c);
public function nettoyer();
}
?>
Comme pour les classes, les interfaces aussi peuvent être auto chargées grâce à la fonction spl_autoload_register().
Implémenter une interface
Pour se servir de l'interface créée, il faut l'implémenter par une classe à l'aide du mot clé
implements comme ceci:
<?php
class Vehicule implements Entretien{
private $couleur;
private $propre;
public function peindre($c){
$this->couleur=$c;
}
public function nettoyer(){
$this->propre=true;
}
}
?>
Dans la classe
Vehicule on doit obligatoirement redéfinir les méthodes peindre() et nettoyer().
Il ne faut pas que qu'une classe aie le même nom qu'une interface.
Implémenter plusieurs interfaces
A l'inverse de l'héritage en PHP, on peut implémenter plusieurs interface simultanément:
<?php
interface Int1{
public function f1();
}
Interface Int2{
public function f2();
}
class Classe implements Int1, Int2{
public function f1(){
}
public function f2(){
}
}
?>
Dans ce cas, dans la classe
Classe on doit redéfinir les méthodes f1() et f2() dont le prototype est défini respectivement dans les interfaces
Int1 et
Int2.
Héritage des interfaces
Comme pour les classes, une interface peut hériter d'une autre. Dans ce cas, la réécriture d'une méthode dans l'interface fille n'est pas autorisée. Bien entendu, il faut réécrire les méthodes de l'interfaces mère et l'interface fille dans la classe qui implémente cette dernière:
<?php
interface Int1{
public function f1();
}
Interface Int2 extends Int1{
public function f2();
}
class Classe implements Int2{
public function f1(){
}
public function f2(){
}
}
?>
Constante d'interface
Comme pour les classes, une constante d'interface appartient à cette dernière. Elle peut donc être appelée statiquement à partir de l'interface dans laquelle elle est déclarée ou de la classe qui implémente l'interface.
Exemple:
<?php
interface Inter{
const CTE="Bonjour";
}
class Classe implements Inter{
}
echo Inter::CTE; // Affiche Bonjour
echo Classe::CTE; // Affiche Bonjour
?>
Les traits
Principe des traits
Les traits ont été intégrés au PHP à partir de sa version 5.4. Ils permettent de minimiser le code en réutilisant des méthodes déjà déclarées sans être obligé d'hériter d'une classe entière.
Un trait ne peut être ni instancié comme une classe ni implémenté comme une interface. Il s'agit d'un bloc de code qui sera réutilisé par une classe.
Création et utilisation des traits
Pour créer un trait on déclare le mot clé
trait suivi de son nom (capitalisé de préférence) puis des accolades qui contiennent le corps comme ceci:
<?php
trait Notification{
public function afficher(){
echo "Alerte signalée!";
}
}
?>
Pour se servir du trait
Notification dans une classe on procède comme ceci:
<?php
class Operation{
use Notification;
}
$op=new Operation();
$op->afficher(); // Affiche "Alerte Signalée!"
?>
Vous avez compris que le code du trait
Notification a été réutilisé comme si'il était déclaré directement dans la classe
Operation.
Un trait peut aussi définir des attributs qui seront repris pas la classe qui l'utilisera.