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
	}
}

Exercices