Modificateurs d’accès en profondeur
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy. Leçon 39 sur 91.
Maintenant que tu comprends les trois modificateurs d’accès, explorons leur comportement dans les scénarios d’héritage. L’idée essentielle est que les membres protected deviennent accessibles aux classes enfants, tandis que les membres private restent masqués, même pour les classes enfants.
<?php
class Vehicle {
public $brand;
protected $engineType;
private $serialNumber;
public function __construct($brand, $engine, $serial) {
$this->brand = $brand;
$this->engineType = $engine;
$this->serialNumber = $serial;
}
private function getSerial() {
return $this->serialNumber;
}
protected function getEngineInfo() {
return $this->engineType;
}
}
class Car extends Vehicle {
public function getDetails() {
return $this->brand . " - " . $this->getEngineInfo();
// $this->serialNumber provoquerait une erreur - privé !
// $this->getSerial() échouerait également - méthode privée !
}
}
$car = new Car("Toyota", "V6", "ABC123");
echo $car->getDetails();
Sortie :
Toyota - V6La classe Car peut accéder à $brand (public) et appeler getEngineInfo() (protected), mais n’a pas accès à $serialNumber ni à getSerial(), car ces éléments sont privés à Vehicle. Cette distinction vous permet de partager certains détails internes avec les classes filles tout en en gardant d’autres complètement cachés.
Point essentiel : Utilisez protected lorsque les classes enfants doivent accéder aux données ou méthodes internes, et private lorsque même les classes enfants ne doivent pas toucher à certains détails d’implémentation.
Défi
FacileConstruisons un système de gestion d’appareils qui explore le comportement des modificateurs d’accès lors de l’héritage. Vous créerez une classe de base Device avec des propriétés présentant différents niveaux de visibilité, puis vous l’étendrez avec une classe Smartphone qui montre quels membres les classes enfants peuvent ou ne peuvent pas utiliser.
Vous organiserez votre code sur trois fichiers :
Device.php: créez une classeDevicequi représente des appareils électroniques avec différents niveaux de sensibilité des données. Incluez :- Une propriété
public$brandpour le nom du fabricant - Une propriété
protected$modelNumberpour l’identification interne - Une propriété
private$manufacturingCodepour les données réservées à l’usine
privategetManufacturingCode()qui renvoie le code de fabrication. Ajoutez une méthodepublicgetModelInfo()qui renvoie"Model: [modelNumber]". Enfin, ajoutez une méthodepublicgetFullCode()qui renvoie"[brand]-[manufacturingCode]". Cela montre comment la classe elle-même peut accéder à ses propres membres privés.- Une propriété
Smartphone.php: créez une classeSmartphonequi étendDevice. Incluez le fichier Device. Le constructeur doit accepter la marque, le numéro de modèle, le code de fabrication et le nom d’un système d’exploitation. Appelez le constructeur parent avec les trois premières valeurs, puis stockez le système d’exploitation dans une propriété privée. Ajoutez une méthode publiquegetDeviceDetails()qui renvoie"[brand] [modelNumber] running [os]". Remarquez que vous pouvez accéder directement à la propriété publique$brandet à la propriété protégée$modelNumber, mais que vous ne pouvez pas accéder directement à la propriété privée$manufacturingCode: vous devez utiliser à la place la méthode publique héritéegetFullCode().main.php: incluez le fichier Smartphone. Vous recevrez quatre entrées : un nom de marque, un numéro de modèle, un code de fabrication et un système d’exploitation. Créez une instance deSmartphoneavec ces valeurs. Affichez trois lignes :- Le résultat de l’appel à
getDeviceDetails() - Le résultat de l’appel à la méthode héritée
getModelInfo() - Le résultat de l’appel à la méthode héritée
getFullCode()
- Le résultat de l’appel à
Ce défi met en évidence la distinction essentielle : votre classe Smartphone peut utiliser librement la propriété protégée $modelNumber héritée de Device, mais la propriété privée $manufacturingCode et la méthode getManufacturingCode() restent complètement masquées : elles ne sont accessibles que par l’intermédiaire de l’interface publique que Device choisit d’exposer.
Essayez vous-même
<?php
require_once 'Smartphone.php';
// Lire les entrées
$brand = trim(fgets(STDIN));
$modelNumber = trim(fgets(STDIN));
$manufacturingCode = trim(fgets(STDIN));
$os = trim(fgets(STDIN));
// TODO: Créer une instance de Smartphone avec les valeurs d'entrée
// TODO: Afficher le résultat de getDeviceDetails()
// TODO: Afficher le résultat de la méthode héritée getModelInfo()
// TODO: Afficher le résultat de la méthode héritée getFullCode()
?>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