Menu
Coddy logo textTech

Système bancaire

Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy. Leçon 89 sur 91.

challenge icon

Défi

Facile

Construisons 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 classe Transaction pour enregistrer les opérations financières. Utilisez la promotion du constructeur pour type (chaîne de caractères : "deposit", "withdrawal" ou "transfer"), amount (nombre à virgule flottante) et timestamp (chaîne de caractères). Toutes les propriétés doivent être publiques et en lecture seule. Ajoutez une méthode getDescription(): string qui renvoie "[type]: $[amount]" (formatez le montant avec 2 décimales).
  • BankAccount.php : incluez le fichier Transaction. Créez une classe abstraite BankAccount avec :
    • La promotion du constructeur pour accountNumber (chaîne de caractères, publique et en lecture seule) et holderName (chaîne de caractères, publique et en lecture seule)
    • Une propriété $balance protégée, initialisée à 0.0
    • Un tableau privé pour stocker l’historique des transactions
    • getBalance(): float : renvoie le solde actuel
    • deposit(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 retrait
    • addTransaction(Transaction $t): void : méthode protégée pour ajouter des transactions à l’historique
    • getTransactionCount(): int : renvoie le nombre de transactions
  • SavingsAccount.php : incluez le fichier BankAccount. Créez une classe SavingsAccount qui étend BankAccount avec :
    • Une constante de classe INTEREST_RATE dé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]"
  • CheckingAccount.php : incluez le fichier BankAccount. Créez une classe CheckingAccount qui étend BankAccount avec :
    • Une propriété privée $overdraftLimit dé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éussite
    • getOverdraftLimit(): float : renvoie la limite de découvert
  • Bank.php : incluez les deux fichiers de comptes. Créez une classe Bank qui gère les comptes :
    • Un tableau privé pour stocker les comptes, indexés par numéro de compte
    • addAccount(BankAccount $account): void : ajoute un compte
    • findAccount(string $accountNumber): ?BankAccount : renvoie le compte ou null
    • transfer(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 de deposit()
    • "withdraw" : affichez le résultat de withdraw()
    • "transfer" : affichez le résultat de transfer()
    • "interest" : affichez le résultat de applyInterest() (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

Entraînez-vous par vous-même : Compilateur PHP en ligne