Sobes.tech
Junior

Qu'est-ce que l'encapsulation en programmation orientée objet?

sobes.tech IA

Réponse de l'IA

L'encapsulation est la combinaison de données (propriétés) et de méthodes qui travaillent avec ces données dans une entité unique (objet ou classe), ainsi que la dissimulation de l'implémentation interne du monde extérieur. Cela permet de contrôler l'accès aux données et de modifier la structure interne de la classe sans affecter le reste du code.

Aspects principaux de l'encapsulation:

  1. Cacher les données : L'accès direct aux données internes de l'objet est limité. L'accès se fait via des méthodes publiques (getters) pour obtenir des données et des setters pour modifier des données.
  2. Respect des invariants : Les méthodes de la classe peuvent contenir une logique pour vérifier la correction des données lors de leur définition, garantissant que l'objet est dans un état valide.

Exemple :

<?php
class User {
    private string $name; // Propriété cachée
    private int $age;    // Propriété cachée

    public function __construct(string $name, int $age) {
        $this->setName($name);
        $this->setAge($age);
    }

    // Getter pour name
    public function getName(): string {
        return $this->name;
    }

    // Setter pour name avec validation possible
    public function setName(string $name): void {
        // Peut ajouter une validation du nom si nécessaire
        $this->name = $name;
    }

    // Getter pour age
    public function getAge(): int {
        return $this->age;
    }

    // Setter pour age avec validation
    public function setAge(int $age): void {
        if ($age < 0) {
            throw new InvalidArgumentException("L'âge ne peut pas être inférieur à zéro.");
        }
        $this->age = $age;
    }

    // Méthode utilisant les données internes
    public function introduce(): string {
        return "Je m'appelle " . $this->name . " et j'ai " . $this->age . " ans.";
    }
}

// Utilisation de la classe
$user = new User("Ivan", 30);
echo $user->introduce(); // Affiche : Je m'appelle Ivan et j'ai 30 ans.

// Tentative d'accès direct à la propriété privée provoquera une erreur :
// $user->age = -5; // Erreur fatale : Impossible d'accéder à la propriété privée User::$age

// Utilisation du setter avec validation
try {
    $user->setAge(-5);
} catch (InvalidArgumentException $e) {
    echo "\nErreur : " . $e->getMessage(); // Affiche : Erreur : L'âge ne peut pas être inférieur à zéro.
}

Avantages de l'encapsulation :

  • Contrôle d'accès : Définit comment les objets externes peuvent interagir avec les données de la classe.
  • Flexibilité : Permet de modifier l'implémentation interne de la classe sans changer le code externe qui l'utilise.
  • Amélioration de la maintenance du code : Facilite le débogage et la modification, car les changements sont limités à la classe.
  • Protection des données : Empêche la modification incorrecte de l'état de l'objet.