Getters et Setters
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy — leçon 40 sur 91.
Maintenant que vous comprenez 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 réside dans 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 de la 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();
Résultat :
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 assigner des données invalides directement. 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 seulement un setter.
Point clé : Les getters et les setters vous donnent le contrôle sur la manière dont les données privées sont accédées et modifiées, permettant la validation, le formatage ou toute logique personnalisée.
Défi
FacileConstruisons un système d'inventaire de produits qui utilise des getters et des setters 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 — démontrant ainsi comment les setters peuvent appliquer des 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 de caractères),$price(nombre flottant) et$stock(entier). Implémentez des getters et des setters pour chaque propriété avec les règles de validation suivantes :setName()ne doit accepter que des chaînes non vides — si la chaîne est vide après avoir été nettoyée (trim), ne mettez pas à jour la propriétésetPrice()ne doit accepter que des valeurs supérieures à 0 — rejetez les prix nuls ou négatifssetStock()ne doit accepter que des valeurs égales ou supérieures à 0 — rejetez les quantités de stock négatives
getInfo()qui retourne"[name]: $[price] ([stock] in stock)"avec le prix formaté à 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 pour la mise à jour. Créez une instance deProductet utilisez les setters pour assigner le nom initial, le prix (converti en float) et le stock (converti en entier). Affichez le résultat degetInfo(). Ensuite, tentez de mettre à jour le prix avec la nouvelle valeur de prix (convertie en float) et affichez à nouveaugetInfo(). Enfin, tentez de définir le stock à-5(une valeur invalide) et affichezgetInfo()une dernière fois pour confirmer que le stock n'a pas été modifié.
Vos setters agissent comme des gardiens — ils valident les données entrantes avant d'autoriser les modifications des propriétés privées. Lorsqu'une donnée invalide est transmise (comme un stock négatif), le setter l'ignore simplement, conservant la valeur valide existante. C'est tout le pouvoir de l'encapsulation : votre objet maintient 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 name initial, le price (en tant que float), et le stock (en tant qu'integer)
// TODO: Afficher le résultat de getInfo()
// TODO: Mettre à jour le price avec newPrice (en tant que 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
1Les bases de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition de méthodeLe mot-clé finalClasses abstraitesRécapitulatif - Hiérarchie des employés7Encapsulation
Public, Protégé, PrivéModificateurs d'accès en détailGetters et SettersMasquage d'informationPromotion de constructeur (8.0)Récapitulatif - Système de gestion d'étudiants10Concepts avancés de la POO
Composition vs HéritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibers (PHP 8.1)Clonage d'objets : analyse approfondieGénérateurs et Itérateurs13Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository2Espaces de noms et Autoloading
Introduction aux espaces de nomsLe mot-clé useStandard d'Autoloading PSR-4L'Autoloader ComposerRécapitulatif - Projet organisé5Interfaces et Contrats
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesInterface vs Classe AbstraiteType Hinting avec les InterfacesRécapitulatif - Calculateur de Formes8Méthodes magiques
Introduction aux méthodes magiques__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Clonage d'objets__serialize & __unserializeRécapitulatif - Collection personnalisée3Propriétés de classe
Propriétés d'instance vs Propriétés statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés readonly (PHP 8.1)Récapitulatif - Gestionnaire de compte bancaire6Polymorphisme
Retour sur la redéfinition de méthodePolymorphisme via les interfacesType Hinting et Types d'unionLiaison statique tardiveRécapitulatif - Processeur de paiement9Traits
Introduction aux TraitsUtilisation de plusieurs TraitsRésolution des conflits de TraitsMéthodes abstraites dans les TraitsTraits vs Héritage12Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie