12- Les interfaces

Les interfaces sont des classes qui n'ont aucun attribut et dont le corps des méthodes ne peut-être défini. Ces interfaces sont implémentées par les classes pour deux raisons :

  • Les obliger à adopter un comportement : elles doivent absolument réécrire les méthodes présentes dans l'interface.
  • Pouvoir, grâce au polymorphisme, les utiliser quand on attend une classe qui implémente cette interface, et qui a donc un comportement particulier.

Une interface, par définition, ne modifie que le comportement d'une classe (les méthodes) et une classe peut implémenter plusieurs interfaces, grâce au mot-clé implements.

Exemple d'utilisation d'une implémentation :

// Déclaration des classes
interface VehiculeRoulant{
    public function rouler();
}

class Garage{
    public static function changerRoues(VehiculeRoulant $vehicule)
    {
        // Nous vérifions que le VehiculeRoulant est hérite bien de Vehicule et a donc la méthode getNom()
        if(get_parent_class($vehicule) == "Vehicule"){
            echo "Changement des roues de " . $vehicule->getNom();
        }
    }
}

abstract class Vehicule{
    protected $nom;
    public function __construct(string $nom)
    {
        $this->nom = $nom;
    }

    public function getNom() : string
    {
        return $this->nom;
    }
}

final class Voiture extends Vehicule implements VehiculeRoulant{
    public function rouler()
    {

    }
}

//utilisation des objets
$voiture = new Voiture("Flash McQueen");
Garage::changerRoues($voiture); // Ecrit : Changement des roues de Flash McQueen

Dans cet exemple nous voulons utiliser la méthode changerRoues() de notre Usine uniquement sur les véhicules roulants. En effet, si nous avions un Bateau, et que nous n'avions pas déclaré l'interface VehiculeRoulant, nous aurions pu essayer de changer les roues du bateau, ce qui n'a aucun sens.