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
1000Tenter 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.
| 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 accessibles 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 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 classeEmployeequi gère les données des employés avec des niveaux de visibilité appropriés. La classe doit posséder :- Une propriété
public$namepour le nom de l'employé (que tout le monde peut voir) - Une propriété
protected$employeeIdpour l'identifiant interne (nécessaire aux classes enfants) - Une propriété
private$salarypour les informations sensibles sur le salaire (seule cette classe doit y accéder directement)
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 publiquegetPublicInfo()qui renvoie"[name] works here".- Une propriété
Manager.php: créez une classeManagerqui étendEmployee. 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 publiquegetTeamInfo()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 degetSalary()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 deManageravec 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()
?>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