Ce concept permet à une classe d’hériter des propriétés et des méthodes d’une autre classe (une classe parente). Cela permet de réutiliser du code pour ainsi éviter de réinventer la roue ! Cette relation hiérarchique est idéale pour une meilleure flexibilité du code, réduction de la duplication du code…
Héritage de base
class Vehicule { public $marque; public function demarrer() { echo "Le véhicule démarre.\n"; } } //ici la classe Voiture hérite de la classe Vehicule class Voiture extends Vehicule { public $nombreDePortes; public function fermerLesPortes() { echo "Les portes sont fermées.\n"; } } $maVoiture = new Voiture(); $maVoiture->marque = "Fiat"; $maVoiture->demarrer(); // Hérité de la classe Véhicule $maVoiture->fermerLesPortes(); // Propre à la classe Voiture
Surcharge de méthode
On parle de surcharge quand une classe héritière a la même nom qu’une méthode déclarée dans la classe parente.
class Animal { public function faireDuBruit() { echo "L'animal fait du bruit.\n"; } } class Chien extends Animal { //Ici la méthode faireDuBruit() est surchargée car exploitée à la fois dans la classe parente et héritière. public function faireDuBruit() { echo "Le chien aboie.\n"; } } $monChien = new Chien(); $monChien->faireDuBruit(); // Affiche "Le chien aboie.".
Accès Protected
Les niveaux de visibilité protected
peuvent être invoquées dans un système d’héritage :
class CompteBancaire { protected $solde; public function __construct($soldeInitial) { $this->solde = $soldeInitial; } } class CompteEpargne extends CompteBancaire { public function afficherSolde() { echo "Le solde est de " . $this->solde . "€.\n"; } } $monEpargne = new CompteEpargne(1000); $monEpargne->afficherSolde(); // Accède à la propriété protégée $solde
Le constructeur
Si une sous-classe ne définit pas son propre constructeur, le constructeur de la classe parent (si présent) est appelé automatiquement
class Vehicule { public $marque; public function __construct($marque) { $this->marque = $marque; echo "Véhicule de marque " . $this->marque . " créé.\n"; } } class Voiture extends Vehicule { // Aucun constructeur défini ici, le constructeur de Véhicule est appelé. } $maVoiture = new Voiture("Peugeot");
Le constructeur d’une classe héritière
Dans l’exemple ci-dessous, Moto
définit son propre constructeur et appelle également le constructeur de Véhicule
en utilisant parent::__construct($marque)
. Cela permet d’initialiser à la fois les propriétés définies dans Véhicule
et celles spécifiques à Moto
:
class Vehicule { public $marque; public function __construct($marque) { $this->marque = $marque; echo "Véhicule de marque " . $this->marque . " créé.\n"; } } class Moto extends Vehicule { public $type; public function __construct($marque, $type) { parent::__construct($marque); // Appel explicite au constructeur parent $this->type = $type; echo "Moto de type " . $this->type . " créée.\n"; } } $maMoto = new Moto("Suzuki", "Sportive");