Passer au contenu principal

Comprendre le polymorphisme en POO

Le polymorphisme, provenant du grec “poly” (plusieurs) et “morphe” (forme), est un concept essentiel de la programmation orientée objet qui permet aux objets d'adopter plusieurs formes ou comportements. Cela se traduit par la possibilité d'appeler une même méthode sur des objets de différentes classes, mais avec des implémentations spécifiques à chaque classe.

Cela offre de nombreux avantages :

  • Il rend le code plus flexible et adaptable.
  • Il favorise la réutilisation du code et facilite sa maintenance.
  • Il améliore la lisibilité du code.

Le polymorphisme se manifeste de trois manières principales :

1. La redéfinition de méthode :

Une méthode définie dans une classe parente peut être redéfinie dans une classe fille. Cela permet d’ajuster le comportement de la méthode en fonction des besoins spécifiques de la classe fille. Ainsi, les classes filles héritent des méthodes de la classe parente tout en ayant la possibilité de personnaliser leur fonctionnement.

2. La surcharge de méthode :

Plusieurs méthodes de la même classe peuvent porter le même nom, mais avec des paramètres ou des types de retour différents. Cela permet de traiter des situations distinctes de manière polymorphe.

La surcharge de méthode n'est pas possible en PHP : Contrairement à d'autres langages comme Java ou C++, PHP ne permet pas d'avoir plusieurs méthodes portant le même nom dans la même classe, même avec des signatures différentes.

3. Les interfaces :

Lorsqu’une classe implémente une interface, elle promet d’implémenter toutes les méthodes définies par cette interface. Ainsi, vous pouvez vous attendre à ce que tous les objets qui implémentent une certaine interface aient un ensemble spécifique de méthodes, indépendamment de leur classe d’origine.

Cela permet d’interagir avec différents objets de manière uniforme, tant qu’ils implémentent la même interface.

interface Animal {
    public function speak(): void;
}

class Dog implements Animal {
    public function speak(): void {
        return "Woof!";
    }
}

class Cat implements Animal {
    public function speak(): void {
        return "Meow!";
    }
}

function makeSpeak(Animal $animal) {
    echo $animal->speak();
}

$dog = new Dog();
$cat = new Cat();

makeSpeak($dog); // Prints "Woof!"
makeSpeak($cat); // Prints "Meow!"