Accesseurs et Mutateurs

DéfinitionPrincipe

L'encapsulation est un pilier de la POO. Il consiste à protéger l'état (attributs) d'un objet en les passant en private ou protected, et en ne permettant leur modification ou leur lecture que via des méthodes publiques.

Ces méthodes s'appellent des accesseurs (getter) pour lire leurs valeurs et des mutateurs (setter) pour modifier leurs valeurs.

Une des conventions souvent utilisée et de reprendre le nom de l'attribut pour créer les méthodes, en ajoutant get pour les accesseurs et set pour les mutateurs.

1
class Identite {
2
  protected $nom;
3
4
  public function getNom(): string {
5
    return $this->nom;
6
  }
7
8
  public function setNom(string $nom){
9
    $this->nom = $nom;
10
  }
11
}

ExempleProblème sans getter et sans setter

1
class Utilisateur {
2
    // L'attribut est public, n'importe qui peut le modifier.
3
    public $age;
4
}
5
6
$user = new Utilisateur();
7
8
// On peut y mettre une valeur valide
9
$user->age = 30;
10
echo $user->age; // Affiche 30
11
12
// MAIS on peut aussi y mettre n'importe quoi...
13
$user->age = -50; // Un âge négatif ? 
14
$user->age = "Bonjour"; // Du texte ?
15
16
// Votre objet est maintenant dans un état "invalide".
17
// Si vous faites un calcul avec $user->age, le programme ne fonctionne plus.

ExempleProblème avec getter et setter

1
class Utilisateur {
2
    // L'attribut est PRIVE.
3
    // Personne à l'extérieur ne peut le toucher directement.
4
    private $age;
5
6
    // Le SETTER CONTRÔLE la valeur qu'on essaie de mettre.
7
    public function setAge(int $nouvelAge): void {
8
        if ($nouvelAge >= 0 && $nouvelAge <= 130) {
9
            // La valeur est valide, on l'accepte.
10
            $this->age = $nouvelAge;
11
        } else {
12
            // La valeur est invalide, on la rejette.
13
            // On pourrait lever une exception ou mettre une valeur par défaut.
14
            echo "Erreur : L'âge doit être un entier entre 0 et 130.";
15
            // $this->age n'est PAS modifié.
16
        }
17
    }
18
19
    // Le GETTER (Accesseur) : notre "guichet de lecture"
20
    // Il permet de LIRE la valeur de manière contrôlée.
21
    public function getAge(): int {
22
        return $this->age;
23
    }
24
}
25
26
// === Utilisation ===
27
28
$user = new Utilisateur();
29
30
// On ne peut plus faire $user->age = 30; // ERREUR FATALE !
31
32
// On DOIT passer par le setter
33
$user->setAge(30);
34
echo $user->getAge(); // Affiche 30
35
36
// Essayons de mettre une valeur invalide :
37
$user->setAge(-50);
38
// Affiche "Erreur : L'âge doit être un entier entre 0 et 130."
39
40
// L'âge de l'utilisateur n'a pas été modifié par la valeur invalide.
41
// Notre objet est resté dans un état cohérent.
42
echo $user->getAge(); // Affiche toujours 30 (ou la valeur par défaut)