Système bancaire
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy. Leçon 89 sur 91.
Défi
FacileConstruisons un système bancaire qui gère les comptes, les transactions et les transferts entre comptes. Vous allez créer un système avec un encapsulation appropriée pour protéger les données financières, l’héritage pour les différents types de comptes et une validation pour garantir l’intégrité des données.
Vous organiserez votre code sur six fichiers :
Transaction.php: créez une classeTransactionpour enregistrer les opérations financières. Utilisez la promotion du constructeur pourtype(chaîne de caractères : "deposit", "withdrawal" ou "transfer"),amount(nombre à virgule flottante) ettimestamp(chaîne de caractères). Toutes les propriétés doivent être publiques et en lecture seule. Ajoutez une méthodegetDescription(): stringqui renvoie"[type]: $[amount]"(formatez le montant avec 2 décimales).BankAccount.php: incluez le fichier Transaction. Créez une classe abstraiteBankAccountavec :- La promotion du constructeur pour
accountNumber(chaîne de caractères, publique et en lecture seule) etholderName(chaîne de caractères, publique et en lecture seule) - Une propriété
$balanceprotégée, initialisée à 0.0 - Un tableau privé pour stocker l’historique des transactions
getBalance(): float: renvoie le solde actueldeposit(float $amount): string: ajoute le montant au solde, enregistre la transaction et renvoie"Deposited: $[amount]"abstract withdraw(float $amount): string: les classes enfants implémentent les règles de retraitaddTransaction(Transaction $t): void: méthode protégée pour ajouter des transactions à l’historiquegetTransactionCount(): int: renvoie le nombre de transactions
- La promotion du constructeur pour
SavingsAccount.php: incluez le fichier BankAccount. Créez une classeSavingsAccountqui étendBankAccountavec :- Une constante de classe
INTEREST_RATEdéfinie à 0.02 (2 %) withdraw(float $amount): string: si le montant dépasse le solde, renvoie"Insufficient funds"; sinon, déduit le montant, enregistre la transaction et renvoie"Withdrew: $[amount]"applyInterest(): string: calcule les intérêts sur le solde actuel, les ajoute comme un dépôt et renvoie"Interest applied: $[interest]"
- Une constante de classe
CheckingAccount.php: incluez le fichier BankAccount. Créez une classeCheckingAccountqui étendBankAccountavec :- Une propriété privée
$overdraftLimitdéfinie via le constructeur (ajoutez un troisième paramètre avec une valeur par défaut de 100.0) withdraw(float $amount): string: autorise le retrait si le montant ne dépasse pas le solde + la limite de découvert ; renvoie"Insufficient funds (overdraft limit: $[limit])"en cas d’échec ou"Withdrew: $[amount]"en cas de réussitegetOverdraftLimit(): float: renvoie la limite de découvert
- Une propriété privée
Bank.php: incluez les deux fichiers de comptes. Créez une classeBankqui gère les comptes :- Un tableau privé pour stocker les comptes, indexés par numéro de compte
addAccount(BankAccount $account): void: ajoute un comptefindAccount(string $accountNumber): ?BankAccount: renvoie le compte ou nulltransfer(string $fromAccount, string $toAccount, float $amount): string: transfère de l’argent entre les comptes. Renvoie"Source account not found","Destination account not found"ou le résultat du retrait s’il échoue. En cas de réussite, effectue le dépôt sur le compte destinataire et renvoie"Transferred $[amount] from [from] to [to]"
main.php: incluez le fichier Bank. Vous recevrez deux entrées : les données des comptes (JSON) et les opérations (JSON).Format JSON des comptes :
[{"type": "savings", "number": "SAV001", "holder": "Alice", "initial": 1000}, {"type": "checking", "number": "CHK001", "holder": "Bob", "initial": 500, "overdraft": 200}]Format JSON des opérations :
[{"op": "deposit", "account": "SAV001", "amount": 200}, {"op": "withdraw", "account": "CHK001", "amount": 600}, {"op": "transfer", "from": "SAV001", "to": "CHK001", "amount": 300}, {"op": "interest", "account": "SAV001"}, {"op": "balance", "account": "SAV001"}]Créez la banque et tous les comptes (en déposant les montants initiaux). Traitez chaque opération :
"deposit": affichez le résultat dedeposit()"withdraw": affichez le résultat dewithdraw()"transfer": affichez le résultat detransfer()"interest": affichez le résultat deapplyInterest()(uniquement pour les comptes d’épargne)"balance": affichez"[holder] balance: $[balance]"(avec 2 décimales)
Affichez chaque résultat sur une nouvelle ligne. Formatez tous les montants monétaires avec 2 décimales.
N’oubliez pas que les transferts doivent être atomiques : si le retrait échoue, le dépôt ne doit pas avoir lieu. La propriété $balance protégée permet aux classes enfants de la modifier tout en la gardant masquée du code externe, ce qui démontre une encapsulation appropriée dans un contexte financier.
Essayez vous-même
<?php
require_once 'Bank.php';
// Lire l'entrée
$accountsJson = trim(fgets(STDIN));
$operationsJson = trim(fgets(STDIN));
// Analyser les entrées JSON
$accounts = (array)json_decode($accountsJson, true);
$operations = (array)json_decode($operationsJson, true);
// TODO: Créer une instance de Bank
// TODO: Créer les comptes à partir des données des comptes
// Pour chaque compte dans $accounts :
// - Si le type est "savings", créer SavingsAccount
// - Si le type est "checking", créer CheckingAccount (avec découvert si fourni)
// - Ajouter le compte à la banque
// - Déposer le montant initial
// TODO: Traiter chaque opération
// Pour chaque opération dans $operations :
// - "deposit" : Afficher le résultat de deposit()
// - "withdraw": Afficher le résultat de withdraw()
// - "transfer": Afficher le résultat de transfer()
// - "interest": Afficher le résultat de applyInterest() (uniquement pour savings)
// - "balance": Afficher "[holder] balance: $[balance]" (2 décimales)
?>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 Strategy15Défis finaux
Plateforme d’apprentissage en ligneSystème bancaireDéveloppement de personnages de jeuService de location de véhiculesEntraînez-vous par vous-même : Compilateur PHP en ligne