Menu
Coddy logo textTech

Propriétés privées et protégées

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

Jusqu'à présent, nous avons utilisé des propriétés public qui peuvent être consultées de n'importe où. Mais parfois, vous devez restreindre l'accès pour protéger vos données. PHP propose deux modificateurs de visibilité supplémentaires : private et protected.

Une propriété private ne peut être accédée que depuis l'intérieur de la classe qui la définit :

<?php
class BankAccount {
    private $balance = 0;
    
    public function deposit($amount) {
        $this->balance += $amount;
    }
    
    public function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount();
$account->deposit(100);
echo $account->getBalance();

Sortie :

100

Tenter d'accéder à $account->balance directement depuis l'extérieur de la classe provoquerait une erreur. Cela protège le solde contre toute modification sans passer par la méthode deposit.

Une propriété protected fonctionne de manière similaire, mais elle est également accessible par les classes enfants qui étendent le parent :

<?php
class User {
    protected $email;
    
    public function __construct($email) {
        $this->email = $email;
    }
}

class Admin extends User {
    public function showEmail() {
        return $this->email;
    }
}

$admin = new Admin("admin@example.com");
echo $admin->showEmail();

Sortie :

admin@example.com

Point clé : Utilisez private lorsque seule la classe de définition doit accéder à la propriété. Utilisez protected lorsque les classes enfants ont également besoin d'y accéder. Les deux empêchent l'accès externe direct, préservant ainsi l'état interne de votre objet.

challenge icon

Défi

Facile

Construisons un système de gestion des employés sécurisé qui démontre comment protéger les données sensibles en utilisant des propriétés privées et protégées.

Vous allez créer trois fichiers qui travaillent ensemble pour gérer les informations des employés avec un contrôle d'accès approprié :

  • Employee.php — Définissez une classe Employee qui sert de base à tous les employés. Elle doit avoir une propriété protected $name (pour que les classes enfants puissent y accéder) et une propriété private $salary (seule cette classe doit modifier directement les salaires). Le constructeur accepte un nom et un salaire, en initialisant les deux propriétés. Ajoutez une méthode publique getName() qui retourne le nom, une méthode publique getSalary() qui retourne le salaire, et une méthode publique giveRaise($amount) qui augmente le salaire du montant donné.
  • Manager.php — Définissez une classe Manager qui étend Employee. Incluez le fichier Employee en haut. Ajoutez une propriété privée $department. Le constructeur doit accepter le nom, le salaire et le département — appelez le constructeur parent avec parent::__construct($name, $salary), puis initialisez le département. Créez une méthode getDetails() qui retourne "[name] manages [department]" en accédant directement à la propriété protégée $name. Ajoutez également une méthode getDepartment() qui retourne le département.
  • main.php — Incluez les deux fichiers de classe. Créez un Manager avec le nom "Sarah", le salaire 75000, et le département "Engineering". Affichez les détails du manager en utilisant getDetails(). Ensuite, donnez au manager une augmentation de 5000 et affichez son nouveau salaire en utilisant getSalary(). Chaque sortie doit être sur sa propre ligne.

Remarquez comment la classe Manager peut accéder directement à la propriété protégée $name, mais doit utiliser la méthode getSalary() pour accéder au salaire privé. Cela démontre la différence clé entre la visibilité protégée et privée — le mode protégé permet l'accès à la classe enfant tandis que le mode privé garde les données véritablement cachées.

Essayez vous-même

<?php
require_once 'Employee.php';
require_once 'Manager.php';

// TODO: Créer un Manager avec le nom "Sarah", un salaire de 75000, et le département "Engineering"

// TODO: Afficher les détails du manager en utilisant getDetails()

// TODO: Accorder au manager une augmentation de 5000

// TODO: Afficher le nouveau salaire en utilisant 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