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
25Le 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.
Défi
FacileConstruisons 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 classeProductavec 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é à joursetPrice()ne doit accepter que les valeurs supérieures à 0 : rejetez les prix nuls ou négatifssetStock()ne doit accepter que les valeurs supérieures ou égales à 0 : rejetez les quantités en stock négatives
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 deProductet 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 degetInfo(). Tentez ensuite de mettre à jour le prix avec la nouvelle valeur (convertie en nombre à virgule flottante) et affichez à nouveaugetInfo(). Enfin, tentez de définir le stock à-5(une valeur invalide) et affichez une fois de plusgetInfo()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é
?>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
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses et objetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition des méthodesLe mot-clé finalClasses abstraitesRécapitulatif – Hiérarchie des employés7Encapsulation
Public, Protected, PrivateModificateurs d’accès en profondeurAccesseurs et mutateursDissimulation de l’informationPromotion des constructeurs (8.0)Récapitulatif – Système de fiches étudiant10Concepts avancés de la POO
Composition ou héritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibres (PHP 8.1)Approfondissement du clonage d’objetsGénérateurs et itérateurs13Patrons de conception – Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron CompositePatron Dépôt2Espaces de noms et chargement automatique
Introduction aux espaces de nomsLe mot-clé useNorme de chargement automatique PSR-4Autoloader de ComposerRécapitulatif - Projet organisé5Interfaces et contrats
Introduction aux interfacesImplémentation des interfacesImplémentation de plusieurs interfacesInterface ou classe abstraiteIndication de type avec les interfacesRécapitulatif - Calculateur de formes8Méthodes magiques
Introduction aux méthodes magiques__toString et __debugInfo__get, __set, __isset, __unset__call et __callStatic__clone et clonage d’objets__serialize et __unserializeRécapitulatif - Collection personnalisée3Propriétés de classe
Propriétés d’instance vs statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés en lecture seule (PHP 8.1)Récapitulatif - Gestionnaire de comptes bancaires6Polymorphisme
Révision de la redéfinition des méthodesPolymorphisme via les interfacesAnnotations de type et types unionLiaison statique tardiveRécapitulatif - Processeur de paiements9Traits
Introduction aux traitsUtilisation de plusieurs traitsRésolution des conflits entre traitsMéthodes abstraites dans les traitsTraits par rapport à l’héritage12Patrons de conception – Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron StrategyEntraînez-vous par vous-même : Compilateur PHP en ligne