Menu
Coddy logo textTech

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 - V6

La 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.

challenge icon

Défi

Facile

Construisons 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 classe Device qui représente des appareils électroniques avec différents niveaux de sensibilité des données. Incluez :
    • Une propriété public $brand pour le nom du fabricant
    • Une propriété protected $modelNumber pour l’identification interne
    • Une propriété private $manufacturingCode pour les données réservées à l’usine
    Le constructeur doit accepter les trois valeurs. Ajoutez une méthode private getManufacturingCode() qui renvoie le code de fabrication. Ajoutez une méthode public getModelInfo() qui renvoie "Model: [modelNumber]". Enfin, ajoutez une méthode public getFullCode() qui renvoie "[brand]-[manufacturingCode]". Cela montre comment la classe elle-même peut accéder à ses propres membres privés.
  • Smartphone.php : créez une classe Smartphone qui étend Device. 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 publique getDeviceDetails() qui renvoie "[brand] [modelNumber] running [os]". Remarquez que vous pouvez accéder directement à la propriété publique $brand et à 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ée getFullCode().
  • 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 de Smartphone avec 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()

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()
?>
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur PHP en ligne