Sistema bancario
Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 89 di 91.
Sfida
FacileCreiamo un Sistema bancario che gestisce conti, transazioni e trasferimenti tra conti. Creerai un sistema con un corretto incapsulamento per proteggere i dati finanziari, ereditarietà per i diversi tipi di conto e convalida per garantire l'integrità dei dati.
Organizzerai il codice in sei file:
Transaction.php: crea una classeTransactionper registrare le operazioni finanziarie. Usa la promozione dei parametri del costruttore pertype(stringa: "deposit", "withdrawal" o "transfer"),amount(float) etimestamp(stringa). Tutte le proprietà devono essere public readonly. Aggiungi un metodogetDescription(): stringche restituisce"[type]: $[amount]"(formatta l'importo con 2 cifre decimali).BankAccount.php: includi il file Transaction. Crea una classe astrattaBankAccountcon:- Promozione dei parametri del costruttore per
accountNumber(stringa, public readonly) eholderName(stringa, public readonly) - Una proprietà protetta
$balanceinizializzata a 0.0 - Un array privato per memorizzare la cronologia delle transazioni
getBalance(): float: restituisce il saldo correntedeposit(float $amount): string: aggiunge l'importo al saldo, registra la transazione e restituisce"Deposited: $[amount]"abstract withdraw(float $amount): string: le classi figlie implementano le regole di prelievoaddTransaction(Transaction $t): void: metodo protetto per aggiungere transazioni alla cronologiagetTransactionCount(): int: restituisce il numero di transazioni
- Promozione dei parametri del costruttore per
SavingsAccount.php: includi il file BankAccount. Crea una classeSavingsAccountche estendeBankAccountcon:- Una costante di classe
INTEREST_RATEimpostata a 0.02 (2%) withdraw(float $amount): string: se l'importo supera il saldo, restituisce"Insufficient funds"; altrimenti lo sottrae, registra la transazione e restituisce"Withdrew: $[amount]"applyInterest(): string: calcola gli interessi sul saldo corrente, li aggiunge come deposito e restituisce"Interest applied: $[interest]"
- Una costante di classe
CheckingAccount.php: includi il file BankAccount. Crea una classeCheckingAccountche estendeBankAccountcon:- Una proprietà privata
$overdraftLimitimpostata tramite il costruttore (aggiungi un terzo parametro con valore predefinito 100.0) withdraw(float $amount): string: consente il prelievo se l'importo non supera il saldo + il limite di scoperto; in caso di errore restituisce"Insufficient funds (overdraft limit: $[limit])", altrimenti restituisce"Withdrew: $[amount]"getOverdraftLimit(): float: restituisce il limite di scoperto
- Una proprietà privata
Bank.php: includi entrambi i file dei conti. Crea una classeBankche gestisce i conti:- Un array privato per memorizzare i conti indicizzati per numero di conto
addAccount(BankAccount $account): void: aggiunge un contofindAccount(string $accountNumber): ?BankAccount: restituisce il conto oppure nulltransfer(string $fromAccount, string $toAccount, float $amount): string: trasferisce denaro tra conti. Restituisce"Source account not found","Destination account not found"oppure il risultato del prelievo se non va a buon fine. In caso di successo, deposita l'importo sul conto destinatario e restituisce"Transferred $[amount] from [from] to [to]"
main.php: includi il file Bank. Riceverai due input: i dati dei conti (JSON) e le operazioni (JSON).Formato JSON dei conti:
[{"type": "savings", "number": "SAV001", "holder": "Alice", "initial": 1000}, {"type": "checking", "number": "CHK001", "holder": "Bob", "initial": 500, "overdraft": 200}]Formato JSON delle operazioni:
[{"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"}]Crea la banca e tutti i conti (versando gli importi iniziali). Elabora ogni operazione:
"deposit": stampa il risultato dideposit()"withdraw": stampa il risultato diwithdraw()"transfer": stampa il risultato ditransfer()"interest": stampa il risultato diapplyInterest()(solo per i conti di risparmio)"balance": stampa"[holder] balance: $[balance]"(2 cifre decimali)
Stampa ogni risultato su una nuova riga. Formatta tutti gli importi monetari con 2 cifre decimali.
Ricorda che i trasferimenti devono essere atomici: se il prelievo non va a buon fine, il deposito non deve avvenire. La proprietà protetta $balance consente alle classi figlie di modificarla mantenendola nascosta al codice esterno, dimostrando un corretto incapsulamento in un contesto finanziario.
Provalo tu
<?php
require_once 'Bank.php';
// Leggi l'input
$accountsJson = trim(fgets(STDIN));
$operationsJson = trim(fgets(STDIN));
// Analizza gli input JSON
$accounts = (array)json_decode($accountsJson, true);
$operations = (array)json_decode($operationsJson, true);
// TODO: Crea un'istanza di Bank
// TODO: Crea gli account dai dati degli account
// Per ogni account in $accounts:
// - Se type è "savings", crea SavingsAccount
// - Se type è "checking", crea CheckingAccount (con scoperto, se fornito)
// - Aggiungi l'account alla banca
// - Deposita l'importo iniziale
// TODO: Elabora ogni operazione
// Per ogni operazione in $operations:
// - "deposit": Stampa il risultato di deposit()
// - "withdraw": stampa il risultato di withdraw()
// - "transfer": stampa il risultato di transfer()
// - "interest": stampa il risultato di applyInterest() (solo per i conti di risparmio)
// - "balance": stampa "[holder] balance: $[balance]" (con 2 cifre decimali)
?>Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave $thisMetodiProprietàCostruttore (__construct)Distruttore (__destruct)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa parola chiave parent::Sovrascrittura dei metodiLa parola chiave finalClassi astratteRiepilogo - Gerarchia dei dipendenti7Incapsulamento
Pubblico, Protetto, PrivatoApprofondimento sui modificatori di accessoGetter e SetterOccultamento delle informazioniPromozione dei parametri del costruttore (8.0)Riepilogo - Sistema di gestione dei registri degli studenti10Concetti avanzati di programmazione a oggetti
Composizione vs ereditarietàDependency InjectionClassi anonimeEnumerazioni (PHP 8.1)Fibers (PHP 8.1)Approfondimento sulla clonazione degli oggettiGeneratori e iteratori13Modelli di progettazione, parte 2
Modello CommandModello AdapterModello DecoratorModello Template MethodModello StateModello CompositeModello Repository2Namespace e autoloading
Introduzione ai namespaceLa keyword useStandard di autoloading PSR-4Autoloader di ComposerRiepilogo - Progetto organizzato5Interfacce e contratti
Introduzione alle interfacceImplementare le interfacceImplementare più interfacceInterfaccia vs classe astrattaType hinting con le interfacceRiepilogo - Calcolatore di forme8Metodi magici
Introduzione ai metodi magici__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e clonazione degli oggetti__serialize e __unserializeRiepilogo - Collezione personalizzata11Sistema dei tipi e gestione degli errori
Dichiarazioni di tipoTipi nullableTipi unione e intersezioneClassi di eccezioneGerarchia di eccezioni personalizzataTry, Catch, FinallyRiepilogo - Validatore di moduli14Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Proprietà delle classi
Proprietà di istanza e staticheCostanti nelle classiMetodi e proprietà staticiProprietà private e protectedProprietà readonly (PHP 8.1)Riepilogo - Gestore di conti bancari6Polimorfismo
Ridefinizione dei metodi, ripresaPolimorfismo tramite interfacceSuggerimenti sui tipi e tipi UnionBinding statico tardivoRiepilogo - Processore di pagamenti9Tratti
Introduzione ai trattiUtilizzare più trattiRisoluzione dei conflitti tra trattiMetodi astratti nei trattiTratti vs ereditarietà12Design pattern - Parte 1
Introduzione ai design patternPattern SingletonPattern FactoryPattern ObserverPattern Strategy15Sfide finali
Piattaforma di e-learningSistema bancarioSviluppo di un personaggio di giocoServizio di noleggio veicoliEsercitati da solo: Compilatore PHP online