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 est les getters et les 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 de la 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 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 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 suppression des espaces (trimming), 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 de 0 ou plus — rejetez les quantités en 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 intacte. C'est toute la puissance de l'encapsulation : votre objet maintient son intégrité quel que soit ce que le code externe tente de faire.
Aide-mémoire
Utilisez des getters et setters pour fournir un accès contrôlé aux propriétés privées. Un getter récupère une valeur, tandis qu'un setter la modifie avec une validation facultative :
<?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(); // john@example.com
echo $user->getAge(); // 25
Les setters peuvent valider les données avant de les stocker. Si la validation échoue, le setter peut ignorer la mise à jour, gardant la valeur existante intacte. Vous pouvez 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.
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 tant que float) et le stock (en tant qu'entier)
// TODO : Afficher le résultat de getInfo()
// TODO : Mettre à jour le prix avec newPrice (en tant que float) et afficher à nouveau getInfo()
// 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