Menu
Coddy logo textTech

Accesseurs et mutateurs

Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy. Leçon 40 sur 91.

Maintenant que tu comprends les modificateurs d’accès, comment interagir en toute sécurité avec des propriétés privées depuis l’extérieur de la classe ? La réponse est : les getters et setters — des méthodes publiques qui fournissent un accès contrôlé aux données privées.

Un getter récupère la valeur d'une propriété, tandis qu'un setter la modifie. Ce modèle vous permet d'ajouter une validation ou une logique lorsque les données sont consultées ou modifiées :

<?php
class User {
    private string $email;
    private int $age;
    
    public function getEmail(): string {
        return $this->email;
    }
    
    public function setEmail(string $email): void {
        if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $this->email = $email;
        }
    }
    
    public function getAge(): int {
        return $this->age;
    }
    
    public function setAge(int $age): void {
        if ($age >= 0 && $age <= 150) {
            $this->age = $age;
        }
    }
}

$user = new User();
$user->setEmail("john@example.com");
$user->setAge(25);

echo $user->getEmail() . "\n";
echo $user->getAge();

Sortie :

john@example.com
25

Le setter valide le format de l’e-mail et s’assure que l’âge est raisonnable avant de stocker les valeurs. Sans setters, n’importe qui pourrait attribuer directement des données invalides. Vous pouvez également créer des propriétés en lecture seule en fournissant uniquement un getter, ou des propriétés en écriture seule avec uniquement un setter.

Point clé : Les getter et les mutateurs vous donnent le contrôle sur la manière dont les données privées sont consultées et modifiées, ce qui permet la validation, le formatage ou toute logique personnalisée.

challenge icon

Défi

Facile

Construisons un système d’inventaire de produits qui utilise des accesseurs et des mutateurs pour protéger et valider les données des produits. Vous allez créer une classe Product qui garantit que les prix sont toujours positifs et que les quantités en stock ne sont jamais négatives, montrant ainsi comment les mutateurs peuvent faire respecter les règles métier.

Vous organiserez votre code sur deux fichiers :

  • Product.php : créez une classe Product avec trois propriétés privées : $name (chaîne), $price (nombre à virgule flottante) et $stock (entier). Implémentez des accesseurs et des mutateurs pour chaque propriété en appliquant les règles de validation suivantes :
    • setName() ne doit accepter que les chaînes non vides : si la chaîne est vide après suppression des espaces superflus, ne mettez pas la propriété à jour
    • setPrice() ne doit accepter que les valeurs supérieures à 0 : rejetez les prix nuls ou négatifs
    • setStock() ne doit accepter que les valeurs supérieures ou égales à 0 : rejetez les quantités en stock négatives
    Chaque accesseur doit simplement renvoyer la valeur de la propriété correspondante. Ajoutez une méthode publique getInfo() qui renvoie "[name]: $[price] ([stock] in stock)", avec le prix formaté sur 2 décimales.
  • main.php : incluez le fichier Product. Vous recevrez quatre entrées : un nom de produit, un prix, une quantité en stock et un nouveau prix à mettre à jour. Créez une instance de Product et utilisez les mutateurs pour attribuer le nom initial, le prix (converti en nombre à virgule flottante) et le stock (converti en entier). Affichez le résultat de getInfo(). Tentez ensuite de mettre à jour le prix avec la nouvelle valeur (convertie en nombre à virgule flottante) et affichez à nouveau getInfo(). Enfin, tentez de définir le stock à -5 (une valeur invalide) et affichez une fois de plus getInfo() pour confirmer que le stock n’a pas été modifié.

Vos mutateurs jouent le rôle de gardiens. Ils valident les données reçues avant d’autoriser les modifications des propriétés privées. Lorsqu’une donnée invalide est transmise (comme un stock négatif), le mutateur l’ignore simplement et conserve la valeur valide existante. C’est là toute la puissance de l’encapsulation : votre objet conserve son intégrité, quel que soit ce que le code externe tente de faire.

Essayez vous-même

<?php
require_once 'Product.php';

// Lire les entrées
$name = trim(fgets(STDIN));
$price = trim(fgets(STDIN));
$stock = trim(fgets(STDIN));
$newPrice = trim(fgets(STDIN));

// TODO: Créer une nouvelle instance de Product

// TODO: Utiliser les setters pour assigner le nom initial, le prix (en float) et le stock (en integer)

// TODO: Afficher le résultat de getInfo()

// TODO: Mettre à jour le prix avec newPrice (en float) et afficher getInfo() à nouveau

// TODO: Tenter de définir le stock à -5 (invalide) et afficher getInfo() pour confirmer que le stock n'a pas été modifié

?>
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur PHP en ligne