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
1000Tenter 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.
| Modificateur | Même classe | Classe enfant | Extérieur |
|---|---|---|---|
public | Oui | Oui | Oui |
protected | Oui | Oui | Non |
private | Oui | Non | Non |
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é.
Défi
FacileConstruisons 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 classeEmployeequi gère les données des employés avec les niveaux de visibilité appropriés. La classe doit avoir :- Une propriété
public$namepour le nom de l'employé (sûr pour tout le monde) - Une propriété
protected$employeeIdpour l'ID interne (nécessaire pour les classes enfants) - Une propriété
private$salarypour les informations de paie sensibles (seule cette classe doit y accéder directement)
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 publiquegetPublicInfo()qui retourne"[name] works here".- Une propriété
Manager.php— Créez une classeManagerqui étendEmployee. 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 publiquegetTeamInfo()qui retourne"Manager [name] (ID: [employeeId]) leads [department]". Remarquez comment la classe enfant peut accéder au$employeeIdprotégé mais aurait besoin degetSalary()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 deManageravec 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 :
| Modificateur | Même classe | Classe enfant | Extérieur |
|---|---|---|---|
public | Oui | Oui | Oui |
protected | Oui | Oui | Non |
private | Oui | Non | Non |
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
privatepour les données internes qui ne devraient pas être accédées directement - Utilisez
protectedpour les données dont les classes enfants ont besoin - Utilisez
publicuniquement 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()
?>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