Masquage d'information
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy — leçon 41 sur 91.
Le masquage d'informations est le principe qui sous-tend l'encapsulation - l'idée qu'une classe ne doit exposer que ce qui est nécessaire et masquer ses détails d'implémentation internes. Alors que les modificateurs d'accès et les getters/setters sont les outils, le masquage d'informations est la philosophie de conception qui guide la manière dont vous les utilisez.
L'objectif est de créer une frontière claire entre ce qu'une classe fait (son interface publique) et comment elle le fait (son implémentation interne). Cette séparation signifie que vous pouvez modifier le fonctionnement interne sans affecter le code qui utilise la classe :
<?php
class Temperature {
private float $celsius;
public function setCelsius(float $value): void {
$this->celsius = $value;
}
public function getCelsius(): float {
return $this->celsius;
}
public function getFahrenheit(): float {
return ($this->celsius * 9/5) + 32;
}
}
$temp = new Temperature();
$temp->setCelsius(25);
echo $temp->getCelsius() . "C = " . $temp->getFahrenheit() . "F";
Sortie :
25C = 77FLa class stocke la température en interne en Celsius, mais les utilisateurs n'ont pas besoin de le savoir. Vous pourriez plus tard modifier le stockage interne en Fahrenheit ou Kelvin, et tant que les méthodes public fonctionnent toujours de la même manière, aucun code externe ne sera interrompu.
Point clé : Le masquage d'informations protège votre code des modifications. Masquez les détails d'implémentation, n'exposez que des interfaces stables, et vos classes deviendront plus faciles à maintenir et à modifier au fil du temps.
Défi
FacileConstruisons un convertisseur de devises qui démontre le masquage d'informations en action. Vous allez créer une classe qui stocke l'argent en interne dans une seule devise mais qui peut se convertir de manière transparente vers et depuis plusieurs devises — sans que le code externe ne sache jamais comment les données sont réellement stockées.
Vous organiserez votre code sur deux fichiers :
Money.php— Créez une classeMoneyqui stocke en interne tous les montants en cents (sous forme d'entier) pour éviter les problèmes de précision des nombres à virgule flottante. Ce détail d'implémentation doit être complètement caché aux utilisateurs de la classe. La classe doit fournir :- Une propriété privée pour stocker le montant en cents
setDollars(float $amount)— accepte un montant en dollars et le stocke en interne sous forme de centsgetDollars()— renvoie le montant en dollars (float, 2 décimales)setEuros(float $amount)— accepte des euros et les convertit en cents en utilisant le taux : 1 EUR = 1.10 USDgetEuros()— renvoie le montant converti en euros (float, 2 décimales)getInternalValue()— renvoie la valeur brute en cents (integer) à des fins de débogage
main.php— Incluez le fichier Money. Vous recevrez deux entrées : un montant en dollars et un montant en euros. Créez une instance deMoney. Tout d'abord, définissez le montant en dollars (converti en float) et affichez trois lignes : la valeur en dollars, l'équivalent en euros et la valeur interne en cents. Ensuite, définissez le montant en euros (converti en float) et affichez à nouveau les trois mêmes valeurs.
La beauté de cette conception est que le code externe travaille avec des valeurs familières en dollars et en euros, ignorant complètement que tout est stocké sous forme de cents en interne. Vous pourriez plus tard modifier le stockage interne pour utiliser une devise de base différente ou une stratégie de précision différente, et tant que les méthodes publiques continuent de fonctionner correctement, aucun code externe n'aurait besoin d'être modifié.
Formatez toutes les sorties en dollars et en euros avec exactement 2 décimales. Chaque valeur doit être affichée sur sa propre ligne, ce qui donne un total de six lignes de sortie.
Aide-mémoire
Le masquage d'informations est le principe derrière l'encapsulation - exposer uniquement ce qui est nécessaire tout en cachant les détails d'implémentation interne. Cela crée une frontière claire entre ce qu'une classe fait (interface publique) et comment elle le fait (implémentation interne).
Exemple de masquage d'informations avec une classe Temperature :
<?php
class Temperature {
private float $celsius;
public function setCelsius(float $value): void {
$this->celsius = $value;
}
public function getCelsius(): float {
return $this->celsius;
}
public function getFahrenheit(): float {
return ($this->celsius * 9/5) + 32;
}
}
$temp = new Temperature();
$temp->setCelsius(25);
echo $temp->getCelsius() . "C = " . $temp->getFahrenheit() . "F";
// Sortie : 25C = 77F
La classe stocke la température en interne en Celsius, mais les utilisateurs n'ont pas besoin de le savoir. Le stockage interne pourrait être modifié en Fahrenheit ou en Kelvin sans casser le code externe, tant que les méthodes publiques continuent de fonctionner de la même manière.
Avantages clés : Le masquage d'informations protège le code des changements. En cachant les détails d'implémentation et en n'exposant que des interfaces stables, les classes deviennent plus faciles à maintenir et à modifier au fil du temps.
Essayez vous-même
<?php
require_once 'Money.php';
// Lire les entrées
$dollarAmount = floatval(trim(fgets(STDIN)));
$euroAmount = floatval(trim(fgets(STDIN)));
// TODO: Créer une instance de Money
// TODO: Définir le montant en dollars et afficher :
// - La valeur en dollars (2 décimales)
// - L'équivalent en euros (2 décimales)
// - La valeur interne en cents (entier)
// TODO: Définir le montant en euros et afficher :
// - La valeur en dollars (2 décimales)
// - L'équivalent en euros (2 décimales)
// - La valeur interne en cents (entier)
?>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