OOP Mastery (POO)
Thème :
Junior
1 vues ·1/17 leçonsL’Encapsulation & le Masquage de l’Information
L’encapsulation regroupe des données avec les méthodes qui les manipulent et restreint l’accès direct à l’état interne d’un objet.
Les Modificateurs de Visibilité
<?php
class BankAccount {
private float $balance = 0; // Seulement cette classe
protected string $accountType; // Cette classe + ses enfants
public string $accountNumber; // Tout le monde
public function __construct(string $number, string $type = 'checking') {
$this->accountNumber = $number;
$this->accountType = $type;
}
}
Pourquoi l’Encapsulation est Importante
<?php
// MAUVAIS : Les propriétés publiques permettent des états invalides
class BadAccount {
public float $balance = 0;
}
$account = new BadAccount();
$account->balance = -1000; // Solde négatif invalide !
// BON : Accès contrôlé via des méthodes
class GoodAccount {
private float $balance = 0;
public function deposit(float $amount): void {
if ($amount <= 0) {
throw new InvalidArgumentException('Le montant doit être positif');
}
$this->balance += $amount;
}
public function withdraw(float $amount): void {
if ($amount <= 0) {
throw new InvalidArgumentException('Le montant doit être positif');
}
if ($amount > $this->balance) {
throw new InsufficientFundsException('Fonds insuffisants');
}
$this->balance -= $amount;
}
public function getBalance(): float {
return $this->balance;
}
}
La Visibilité Asymétrique (PHP 8.4)
<?php
class User {
// Lecture publique, écriture privée
public private(set) string $id;
// Lecture publique, écriture protégée
public protected(set) string $name;
public function __construct(string $id, string $name) {
$this->id = $id;
$this->name = $name;
}
}
$user = new User('123', 'Jean');
echo $user->id; // OK - lecture publique
$user->id = '456'; // Erreur ! private(set)
Getters/Setters VS Hooks de Propriété
<?php
// Getters/setters traditionnels
class TraditionalUser {
private string $email;
public function getEmail(): string {
return $this->email;
}
public function setEmail(string $email): void {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException('Email invalide');
}
$this->email = strtolower($email);
}
}
// PHP 8.4 — Hooks de Propriété
class ModernUser {
public string $email {
get => $this->email;
set {
if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException('Email invalide');
}
$this->email = strtolower($value);
}
}
}
Exemple Concret
Un panier d’achat bien encapsulé
<?php
declare(strict_types=1);
// Panier d'achat bien encapsulé
class ShoppingCart {
private array $items = [];
public function addItem(string $productId, int $quantity, float $price): void {
if ($quantity <= 0) {
throw new InvalidArgumentException('La quantité doit être positive');
}
if (isset($this->items[$productId])) {
$this->items[$productId]['quantity'] += $quantity;
} else {
$this->items[$productId] = [
'quantity' => $quantity,
'price' => $price,
];
}
}
public function removeItem(string $productId): void {
unset($this->items[$productId]);
}
public function getTotal(): float {
return array_reduce(
$this->items,
fn($total, $item) => $total + ($item['price'] * $item['quantity']),
0.0
);
}
public function getItemCount(): int {
return array_sum(array_column($this->items, 'quantity'));
}
// Retourne une copie pour éviter les modifications externes
public function getItems(): array {
return $this->items;
}
}
?>
Les Grimoires
📘 Cette leçon fait partie du cours Maîtrise de la POO en PHP sur la plateforme d’apprentissage RostoDev.
Prêt à passer à la suite ?
Vous avez terminé cette leçon sur L'Encapsulation & le Masquage de l'Information. Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.