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");
