Menu
Coddy logo textTech

Public, Protégé, Privé

Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy — leçon 38 sur 91.

Bienvenue dans le chapitre sur l'Encapsulation ! L'Encapsulation consiste à contrôler l'accès aux données internes de votre classe. PHP propose trois modificateurs d'accès qui déterminent d'où les propriétés et les méthodes peuvent être accédées : public, protected et private.

Voici comment chaque modificateur fonctionne :

<?php
class BankAccount {
    public $accountHolder;    // Accessible de n'importe où
    protected $accountNumber; // Accessible dans cette classe et les classes enfants
    private $balance;         // Accessible uniquement dans cette classe
    
    public function __construct($holder, $number, $balance) {
        $this->accountHolder = $holder;
        $this->accountNumber = $number;
        $this->balance = $balance;
    }
    
    public function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount("John", "12345", 1000);

echo $account->accountHolder . "\n";  // Fonctionne - public
echo $account->getBalance();          // Fonctionne - méthode publique

Sortie :

John
1000

Tenter d'accéder directement à $account->balance provoquerait une erreur car il est privé. Il en va de même pour $account->accountNumber depuis l'extérieur de la hiérarchie des classes. Cette protection garantit que les données sensibles ne peuvent être modifiées que par des méthodes contrôlées.

ModificateurMême classeClasse enfantExtérieur
publicOuiOuiOui
protectedOuiOuiNon
privateOuiNonNon

Point clé : Utilisez private pour les données internes qui ne devraient pas être accédées directement, protected pour les données dont les classes enfants ont besoin, et public uniquement pour un accès externe sécurisé.

challenge icon

Défi

Facile

Construisons un système de gestion des employés sécurisé qui démontre comment les modificateurs d'accès protègent les données sensibles. Vous allez créer une hiérarchie de classes où différents niveaux d'information sont accessibles selon l'endroit où le code s'exécute — à l'intérieur de la classe, dans une classe enfant, ou de l'extérieur.

Vous organiserez votre code sur trois fichiers :

  • Employee.php — Créez une classe Employee qui gère les données des employés avec les niveaux de visibilité appropriés. La classe doit avoir :
    • Une propriété public $name pour le nom de l'employé (sûr pour tout le monde)
    • Une propriété protected $employeeId pour l'ID interne (nécessaire pour les classes enfants)
    • Une propriété private $salary pour les informations de paie sensibles (seule cette classe doit y accéder directement)
    Le constructeur doit accepter les trois valeurs et les assigner. Ajoutez une méthode publique getSalary() qui retourne le salaire privé — c'est la manière contrôlée d'accéder aux données protégées. Ajoutez également une méthode publique getPublicInfo() qui retourne "[name] works here".
  • Manager.php — Créez une classe Manager qui étend Employee. Incluez le fichier Employee. Le constructeur doit accepter le nom, l'ID de l'employé, le salaire et un nom de département. Appelez le constructeur parent avec les trois premières valeurs, puis stockez le département dans une propriété privée. Ajoutez une méthode publique getTeamInfo() qui retourne "Manager [name] (ID: [employeeId]) leads [department]". Remarquez comment la classe enfant peut accéder au $employeeId protégé mais aurait besoin de getSalary() pour accéder au salaire privé.
  • main.php — Incluez le fichier Manager. Vous recevrez quatre entrées : un nom, un ID d'employé, un salaire (sous forme de chaîne que vous convertirez en entier) et un nom de département. Créez une instance de Manager avec ces valeurs. Affichez trois lignes :
    • Le nom du manager accédé directement (propriété publique)
    • Le résultat de l'appel à getTeamInfo()
    • Le résultat de l'appel à getSalary()

Ce défi montre l'encapsulation en action : le nom est librement accessible, l'ID de l'employé est partagé avec les classes enfants via la visibilité protégée, et le salaire reste verrouillé dans la classe parente — accessible uniquement via une méthode publique contrôlée.

Aide-mémoire

PHP propose trois modificateurs d'accès pour contrôler où les propriétés et les méthodes peuvent être accédées :

ModificateurMême classeClasse enfantExtérieur
publicOuiOuiOui
protectedOuiOuiNon
privateOuiNonNon

Exemple :

<?php
class BankAccount {
    public $accountHolder;    // Accessible de n'importe où
    protected $accountNumber; // Accessible dans cette classe et les classes enfants
    private $balance;         // Accessible uniquement dans cette classe
    
    public function __construct($holder, $number, $balance) {
        $this->accountHolder = $holder;
        $this->accountNumber = $number;
        $this->balance = $balance;
    }
    
    public function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount("John", "12345", 1000);
echo $account->accountHolder;  // Fonctionne - public
echo $account->getBalance();   // Fonctionne - méthode publique

Bonnes pratiques :

  • Utilisez private pour les données internes qui ne devraient pas être accédées directement
  • Utilisez protected pour les données dont les classes enfants ont besoin
  • Utilisez public uniquement pour un accès externe sécurisé

Essayez vous-même

<?php
require_once 'Manager.php';

// Lire les entrées
$name = trim(fgets(STDIN));
$employeeId = trim(fgets(STDIN));
$salary = intval(trim(fgets(STDIN)));
$department = trim(fgets(STDIN));

// TODO: Créer une instance de Manager avec les valeurs d'entrée

// TODO: Afficher le nom du manager (accédé directement en tant que propriété publique)

// TODO: Afficher le résultat de l'appel à getTeamInfo()

// TODO: Afficher le résultat de l'appel à getSalary()
?>
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