L'encapsulation
Partie théorique
Comme nous l'avons vu dans la séance précédente, pour cacher ou rendre visible les détails internes d'une classe, on utilise un des 3 mots clés suivants : public
, protected
ou private
.
Lorsque l'on cache les détails internes d'une classe pour contrôler l'accès à ses propriétés, on dit que l'on encapsule les données de la classe.
Comment rendre accessible les données qui ont été encapsulées ?Pour accéder à ces données, on utilise des accesseurs (getters) et des mutateurs (setters).
- Un accesseur (getter) est une méthode qui permet de lire la valeur d'une propriété privée ou protégée.
- Un mutateur (setter) est une méthode qui permet de modifier la valeur d'une propriété privée ou protégée.
L'utilisation de getters et setters offre plusieurs avantages :
- Ils fournissent un contrôle détaillé sur la façon dont les propriétés sont accédées ou modifiées.
- Ils peuvent ajouter une logique supplémentaire (par exemple, la validation des données) lors de la modification des propriétés.
- Ils permettent de changer la structure interne de la classe sans affecter le code extérieur qui l'utilise.
L'encapsulation consiste à cacher les détails de l'implémentation d'une classe et de n'exposer qu'une interface publique. En d'autres termes, les détails de l'implémentation d'une classe doivent être privés, et seules certaines propriétés et méthodes doivent être publiques.
L'encapsulation est un principe fondamental de la programmation orientée objet.
Exemple pratique
class Voiture {
private $marque;
// Getter pour la marque
public function getMarque() {
return $this->marque;
}
// Setter pour la marque
public function setMarque($m) {
$this->marque = $m;
}
}
$voiture = new Voiture();
$voiture->marque = "Peugeot"; // Génère une erreur car la propriété n'est pas accessible *(`private`)*
$voiture->setMarque("Peugeot"); // On utilise le mutateur pour modifier la marque
print($voiture->marque); // Génère une erreur car la propriété n'est pas accessible *(`private`)*
print($voiture->getMarque()); // On utilise l'accesseur pour afficher la marque
La visibilité des accesseurs et des mutateurs est toujours public
.
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Dans ce TP, nous allons créer une classe Personnage
qui représente un personnage de jeu. Chaque personnage aura des propriétés privées pour son nom, ses points de vie et son expérience. Nous utiliserons l'encapsulation pour contrôler l'accès à ces propriétés.
Voici les étapes à suivre :
-
Dans votre répertoire "Documents" créez le répertoire
tp_jeu_combat
. -
Dans ce répertoire, créez le fichier
autoload.php
:<?php
spl_autoload_register(function($class) {
require 'classes/' . $class . '.php';
}); -
Dans ce répertoire, créez le fichier
main.php
:<?php
include 'autoload.php';
// Jeu de combat
print("Jeu de combat \n\n"); -
Testez le fonctionnement de ce fichier :
php main.php
-
Dans le répertoire
jeu_combat
créez le répertoireclasses
-
Dans ce répertoire, créez le fichier
Personnage.php
pour définir la classePersonnage
. -
Définissez la classe
Personnage
avec trois propriétés privées :$nom
,$pointsDeVie
et$experience
. -
Créez des accesseurs (getters) pour chaque propriété. Ces méthodes vous permettront d'accéder aux valeurs des propriétés privées à l'extérieur de la classe.
-
Créez des mutateurs (setters) pour chaque propriété. Ces méthodes vous permettront de modifier les valeurs des propriétés privées à l'extérieur de la classe.
Assurez-vous d'ajouter des vérifications pour garantir que les valeurs soient valides (par exemple, les points de vie et l'expérience doivent être des nombres positifs).
-
Créez une méthode
gagnerExperience
qui augmente l'expérience du personnage d'une certaine quantité. -
Dans le fichier
main.php
, créez une instance de la classePersonnage
et testez toutes les méthodes :setNom("Arthur");
setPointsDeVie(100);
setExperience(0);
getNom()
getPointsDeVie()
getExperience()
gagnerExperience(10)
getExperience()
Une solution
Vous devez être connecté pour voir le contenu.