Programmation orientée objet (POO) en PHP

Auteur: Mohamed CHINY Durée necessaire pour le cours de Programmation orientée objet (POO) en PHP Niveau recommandé pour le cours de Programmation orientée objet (POO) en PHP Supports vidéo disponibles pour ce cours Exercices de renforcement disponibles pour ce cours Quiz non disponibles pour ce cours

Page 10: Interfaces et traits

Toutes les pages

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.