Aller au contenu principal

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.

attention

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
astuce

La visibilité des accesseurs et des mutateurs est toujours public.

Test de mémorisation/compréhension


Qu'est-ce qu'un getter en PHP ?


Qu'est-ce qu'un setter en PHP ?


Quel est l'avantage d'utiliser des getters et setters en PHP ?



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 :

  1. Dans votre répertoire "Documents" créez le répertoire tp_jeu_combat.

  2. Dans ce répertoire, créez le fichier autoload.php :

    <?php
    spl_autoload_register(function($class) {
    require 'classes/' . $class . '.php';
    });
  3. Dans ce répertoire, créez le fichier main.php :

    <?php
    include 'autoload.php';

    // Jeu de combat
    print("Jeu de combat \n\n");
  4. Testez le fonctionnement de ce fichier :

    php main.php

  5. Dans le répertoire jeu_combat créez le répertoire classes

  6. Dans ce répertoire, créez le fichier Personnage.phppour définir la classe Personnage.

  7. Définissez la classe Personnage avec trois propriétés privées : $nom, $pointsDeVie et $experience.

  8. 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.

  9. 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).

  10. Créez une méthode gagnerExperience qui augmente l'expérience du personnage d'une certaine quantité.

  11. Dans le fichier main.php, créez une instance de la classe Personnage et testez toutes les méthodes :

    setNom("Arthur");
    setPointsDeVie(100);
    setExperience(0);
    getNom()
    getPointsDeVie()
    getExperience()
    gagnerExperience(10)
    getExperience()
Une solution