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.
Définition :
L’encapsulation est le principe qui consiste à regrouper les propriétés et les méthodes dans une même classe, tout en contrôlant l’accès à ces données.
Explication :
On utilise les modificateurs de visibilité :
public→ accessible partoutprotected→ accessible dans la classe et les classes enfantsprivate→ accessible uniquement dans la classe
On protège les données avec des getters et setters.
Exemple :
<?php
class CompteBancaire {
private $solde = 0; // Encapsulé
public function deposer($montant) {
if ($montant > 0) {
$this->solde += $montant;
}
}
public function getSolde() { // Getter
return $this->solde;
}
}
$compte = new CompteBancaire();
$compte->deposer(1000);
// $compte->solde = -500; → Impossible (private)
echo "Solde : " . $compte->getSolde() . " €\n";
?>
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.