Héritage
Notions
L'héritage est une notion objet qui permet de décrire des objets ainsi que ses dérivés. Par exemple, une voiture fait partie de la catégorie des véhicules à moteur. De la même manière, un monospace est un sous-ensemble des voitures.
Ces classes partagent des caractéristiques communes (par exemple propulsion par moteur) mais ont aussi des caractéristiques qui les spécialisent (nous partirons du principe qu'une voiture dispose de quatre roues.
On parle ici de la notion d'héritage. La classe décrivant une voiture héritera des caractéristiques des véhicules à moteur et y ajoutera ses spécificités.
PHP
En php, on utilisera le mot clé permettant l'héritage extends
.
Une classe hérite les attributs et le méthodes de la classe mère.
PHP ne permet l'héritage que d'une seule classe mère (une voiture ne peut à la fois hériter des véhicules à moteurs et des zones de diffusion de musique).
<?php class Vehicule { public $places; public $passagers; function __contruct($nb) { $this->places = $nb; $this->passagers = array(); } function ajouterPassager($newPassager) { if($this->places <= count($this->passager)) throw new Exception('Le vehicule est plein'); $this->passagers[] = $newPassager; } } ?>
Héritage strict
Si la classe voiture hérite de la classe vehicule alors toute instance de voiture est aussi une instance de vehicule et peut donc être manipulée de la même manière.
Il est possible de redéfinir une méthode de la classe mère mais son prototype (nombre de paramètres) doit rester compatible avec le prototype de la classe mère, c'est à dire comporter au moins autant d'arguments. Seuls les constructeurs échappent à cette règle.
Portée des attributs et des méthodes
La portée des attributs et des méthodes peut être modifiée en utilisant en préfixe les mots clés suivants :
public
- La méthode ou l'attribut publique est accessible depuis l'ensemble de l'application. C'est le comportement par défaut.
protected
- La méthode ou l'attribut protégé est visible dans la classe ainsi qu'à toutes ses classes dérivées.
private
- La méthode ou l'attribut privé n'est visible qu'à l'intérieur de la classe
Encapsulation
L’encapsulation est l'idée de protéger l'information contenue dans un objet et de ne proposer que des méthodes de manipulation de cet objet. On cache une partie des informations contenues par la classe. L'accès se fait par des méthodes dédiés. Ainsi, on s'assure que l'utilisateur ne peut pas mettre en péril le comportement vital de la classe.
<?php class Vehicule { private $places; // L'attribut est privé et donc protégé function __contruct($nb) { $this->places = $nb; } function getPlaces() { // accesseur permettant de lire le contenu // On peut mettre ici des instructions supplémentaires. return $this->places; } function setPlaces($newPlaces) { // accesseur permettant d'écrire le contenu // On peut mettre ici des instructions supplémentaires comme des conditionnelles par exemple. $this->places = $newPlaces; } } ?>
Accès au parent
Lors de la redéfinition d'une méthode (y compris le constructeur), il est possible de faire appel à la
méthode du parent entre utilisant la syntaxe parent::
<?php class Vehicule { function avancer() { echo "J'avance"; } } class Voiture extends Vehicule { function demarrer() { // Méthode spécifique echo "Je démarre\n"; } function avancer() { // Surchage de la méthode du parent $this->demarrer(); // Appel de contenu différent parent::avancer(); // Appel de la méthode avancer du parent } }