Académique Documents
Professionnel Documents
Culture Documents
2018 – 2019
Cours PHP
n°4
L’héritage ................................................................................................................................................... 3
Introduction ......................................................................................................................................................... 3
Définition ............................................................................................................................................................. 3
Intérêt de l’héritage de classe.............................................................................................................................. 3
Relation entre classes .......................................................................................................................................... 3
Déclarer un héritage de classe ............................................................................................................................. 4
Visibilité « Protected » ......................................................................................................................................... 4
Encapsulation....................................................................................................................................................... 4
Contexte statique et opérateur de résolution de portée ..................................................................................... 5
Appel externes ................................................................................................................................................ 5
Appel internes ................................................................................................................................................. 5
Appel au parent .............................................................................................................................................. 5
Surcharge de méthode ......................................................................................................................................... 5
Abstraction........................................................................................................................................................... 6
Classes ............................................................................................................................................................. 6
Méthodes ........................................................................................................................................................ 6
Classes finales ...................................................................................................................................................... 7
Introduction
L'héritage est un des grands principes de la programmation orientée objet et PHP l'implémente
dans son modèle objet. Ce principe va affecter la manière les relations interclasses et permettre
d’optimiser une application.
Définition
Quand on parle d'héritage, on dit que la classe B hérite de la classe A. La classe A est donc
considérée comme la classe mère et la classe B est considérée comme la classe fille.
Une classe mère peut avoir plusieurs filles, mais une classe fille ne peut pas avoir plusieurs
mères.
L’héritage permet de segmenter et spécialiser les classes d’une application. De plus, cette
relation va permettre de déclarer de nouveaux attributs et de nouvelles méthodes pour la
classe dérivée, qui viennent s'ajouter à ceux et celles héritées.
Lorsque vous étendez une classe, la classe fille hérite de toutes les méthodes publiques et
protégées de la classe parente. Tant qu'une classe fille n'écrase pas ces méthodes, elles
conservent leur fonctionnalités d'origine.
Cet héritage permet de regrouper des fonctionnalités et propriétés communes aux classes
« Mammifères », « Poissons », « Oiseaux », « Reptiles » et « Batraciens », tout en permettant
la mise en place de fonctionnalités supplémentaires dans les classes enfants.
Il est tout à fait possible de rajouter des niveaux d’héritage afin de faire un héritage multiple et
optimiser son application comme ci-après.
Pour étendre une classe, il faut utiliser le mot-clé « extends » suivi du nom de la classe parente.
De cette manière, il sera possible de créer plusieurs filles héritant de la même mère. Il est
également commun de voir une classe fille/mère. C’est à dire qu’elle est l’enfant d’une classe
mais aussi une mère d’une autre classe au minimum.
Visibilité « Protected »
Lorsqu’on utilise l’héritage de classes, un autre niveau de visibilité peut être utilisé que celui vu
précédemment (« public » et « private »), ils s’agit du mot-clé « protected ». L'accès aux
éléments protégés est limité à la classe elle-même et aux classes enfants.
Encapsulation
Les éléments statiques sont des éléments de classe et non pas des éléments d'instances, ils
sortent du modèle objet mais restent accessibles.
Pour ce faire, il faut utiliser l'opérateur :: , appelé opérateur de résolution de portée. Il permet
d'accéder à des éléments « static » externes ou internes à une classe.
Appel externes
L'opérateur de résolution :: permet de d'accéder à un élément « static » (constante, variable
ou méthode statique) d'une classe.
NomDeClasse::NOMDECONSTANTE ;
NomDeClasse::$nomDeVariableStatique ;
NomDeClasse::nomDeMethodeStatique() ;
Appel internes
Le mot self et l'opérateur de résolution permettent d'accéder aux éléments « static » de la
classe elle-même.
self::NOMDECONSTANTE ;
self::$nomDeVariableStatique ;
self::nomDeMethodeStatique() ;
Appel au parent
Le mot parent et l'opérateur de résolution permettent d'accéder aux attributs et méthodes
« static » du parent.
parent::NOMDECONSTANTE
parent::$nomDeVariable ;
parent::nomDeMethode() ;
Surcharge de méthode
La surcharge de méthode consiste à modifier la méthode créée dans la classe parente depuis
une classe enfant.
Classes
Jusqu'à présent, nous avons vu que toutes les classes peuvent être instanciées. Or, il est
nécessaire parfois de rajouter des contraintes à la classe comme bloquer la création d’objet car
inutile dans l’application. On parle alors de classe abstraite.
Par exemple, dans une application permettant de créer des personnages, nous avons besoins
des classes pour créer des guerriers et des magiciens. Par conséquent, aucun intérêt de pouvoir
créer des objets de la classe personnage, elle sera donc abstraite.
Pour déclarer une classe abstraite, il faut utiliser le mot-clé « abstract » devant le nom de la
classe.
Par exemple si vous exécuter le code ci-dessous vous aurez une erreur vous indiquant que la
classe personnage n’est pas instanciable.
$magicien = new Magicien();// Tout va bien, la classe Magicien n'est pas abstraite.
$perso = new Personnage(); // Erreur fatale car on instancie une classe abstraite.
Méthodes
Il est possible de déclarer des méthodes abstraites pour forcer toutes les classes filles à
implémenter cette méthode.
Seul le prototype de la méthode doit être écrit dans la classe abstraite puisque la méthode sera
obligatoirement implémentée dans les classes enfants. On ne doit donc spécifier aucune
instruction.
Attention toute méthode abstraite implique que la classe soit également abstraite sinon une
erreur sera levée.
Classes finales
Le concept des classes et méthodes finales est exactement l'inverse du concept d'abstraction.
Si une classe est finale, vous ne pourrez pas créer de classe fille héritant de cette classe. Ce
concept est peu utilisé puisqu’une application tend très souvent à évoluer et donc à être
modifiée et potentiellement avoir un/des enfant(s).
Introduction
Singleton
Par exemple, dans le cadre d'une application web dynamique, la connexion au serveur de base
de données doit être unique. Il suffit donc par exemple de créer l'unique objet représentant
l'accès à la base de données, de stocker la référence à cet objet dans une variable globale afin
que l'on puisse y accéder de n'importe où.
L’avantage est que l’instance de classe est statique donc accessible partout dans l’application
peu importe le contexte. Cela répond exactement à la problématique de rendre accessible
une même connexion à une BDD dans toute une application.
class BDD {
/*
* Permet de stocker l’instance de la classe
*/
private static $instance = null;
/*
* Le constructeur est en privé pour ne pas créer d’autre objets en dehors de la
* classe
*/
private function __construct() {
echo 'objet créé<br/>';
}
/*
* Méthode qui crée l'unique instance de la classe si elle n'existe pas encore puis la
* retourne.
*/
public static function getInstance() {
if(is_null(self::$instance)) {
self::$instance = new BDD();
}
return self::$instance;
}
}
echo "<pre>";
var_dump($singletonBDDa, $singletonBDDb);
echo "</pre>";
A l’exécution du script, vous obtiendrez alors le résultat suivant. Les deux variables
$singletonBDDa et $singletonBDDb auront pour valeur le même objet.
objet créé
object(BDD)#1 (0) {}
object(BDD)#1 (0) {}