Menu
Coddy logo textTech

Public, Protected, Private

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 fournit trois modificateurs d’accès qui déterminent depuis où les propriétés et les méthodes peuvent être accessibles : public, protected et private.

Voici comment fonctionne chaque modificateur :

<?php
class BankAccount {
    public $accountHolder;    // Accessible depuis 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 public

Sortie :

John
1000

Tenter d’accéder directement à $account->balance provoquerait une erreur, car cette propriété est privée. Il en va de même pour $account->accountNumber depuis l’extérieur de la hiérarchie de classes. Cette protection garantit que les données sensibles ne peuvent être modifiées que par l’intermédiaire de 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 accessibles 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 sécurisé de gestion des employés qui 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 depuis 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 des niveaux de visibilité appropriés. La classe doit posséder :
    • Une propriété public $name pour le nom de l'employé (que tout le monde peut voir)
    • Une propriété protected $employeeId pour l'identifiant interne (nécessaire aux classes enfants)
    • Une propriété private $salary pour les informations sensibles sur le salaire (seule cette classe doit y accéder directement)
    Le constructeur doit accepter les trois valeurs et les leur affecter. Ajoutez une méthode publique getSalary() qui renvoie 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 renvoie "[name] works here".
  • Manager.php : créez une classe Manager qui étend Employee. Incluez le fichier Employee. Le constructeur doit accepter le nom, employeeId, le salaire et le nom d'un service. Appelez le constructeur parent avec les trois premières valeurs, puis stockez le service dans une propriété privée. Ajoutez une méthode publique getTeamInfo() qui renvoie "Manager [name] (ID: [employeeId]) leads [department]". Remarquez que la classe enfant peut accéder à $employeeId, qui est protégé, mais qu'elle aurait besoin de getSalary() pour accéder au salaire privé.
  • main.php : incluez le fichier Manager. Vous recevrez quatre entrées : un nom, un identifiant d'employé, un salaire (sous forme de chaîne que vous convertirez en entier) et un nom de service. Créez une instance de Manager avec ces valeurs. Affichez trois lignes :
    • Le nom du responsable, 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'identifiant de l'employé est partagé avec les classes enfants grâce à une visibilité protégée, et le salaire reste isolé dans la classe parente : il est accessible uniquement au moyen d'une méthode publique contrôlée.

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 (accessible 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

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