Banksystem
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy — Lektion 89 von 91.
Aufgabe
EinfachLassen Sie uns ein Banking System bauen, das Konten, Transaktionen und Überweisungen zwischen Konten verwaltet. Sie werden ein System mit ordnungsgemäßer Kapselung zum Schutz von Finanzdaten, Vererbung für verschiedene Kontotypen und Validierung zur Gewährleistung der Datenintegrität erstellen.
Sie werden Ihren Code über sechs Dateien organisieren:
Transaction.php— Erstellen Sie eineTransaction-Klasse, um Finanzoperationen aufzuzeichnen. Verwenden Sie Constructor Promotion fürtype(string — "deposit", "withdrawal" oder "transfer"),amount(float) undtimestamp(string). Alle Eigenschaften sollten public readonly sein. Fügen Sie eine MethodegetDescription(): stringhinzu, die"[type]: $[amount]"zurückgibt (formatieren Sie den Betrag auf 2 Dezimalstellen).BankAccount.php— Binden Sie die Transaction-Datei ein. Erstellen Sie eine abstrakteBankAccount-Klasse mit:- Constructor Promotion für
accountNumber(string, public readonly) undholderName(string, public readonly) - Einer protected
$balance-Eigenschaft, die mit 0.0 initialisiert wird - Einem privaten Array zum Speichern des Transaktionsverlaufs
getBalance(): float— gibt den aktuellen Kontostand zurückdeposit(float $amount): string— fügt dem Kontostand hinzu, zeichnet die Transaktion auf, gibt"Deposited: $[amount]"zurückabstract withdraw(float $amount): string— Kindklassen implementieren die AuszahlungsregelnaddTransaction(Transaction $t): void— geschützte Methode zum Hinzufügen von Transaktionen zum VerlaufgetTransactionCount(): int— gibt die Anzahl der Transaktionen zurück
- Constructor Promotion für
SavingsAccount.php— Binden Sie die BankAccount-Datei ein. Erstellen Sie eineSavingsAccount-Klasse, dieBankAccounterweitert, mit:- Einer Klassenkonstante
INTEREST_RATE, die auf 0.02 (2%) gesetzt ist withdraw(float $amount): string— wenn der Betrag das Guthaben übersteigt, geben Sie"Insufficient funds"zurück; andernfalls ziehen Sie den Betrag ab, zeichnen die Transaktion auf und geben"Withdrew: $[amount]"zurückapplyInterest(): string— berechnet Zinsen auf das aktuelle Guthaben, fügt diese als Einzahlung hinzu und gibt"Interest applied: $[interest]"zurück
- Einer Klassenkonstante
CheckingAccount.php— Binden Sie die BankAccount-Datei ein. Erstellen Sie eineCheckingAccount-Klasse, dieBankAccounterweitert, mit:- Einer privaten
$overdraftLimit-Eigenschaft, die über den Konstruktor gesetzt wird (fügen Sie einen dritten Parameter mit dem Standardwert 100.0 hinzu) withdraw(float $amount): string— ermöglicht eine Auszahlung, wenn der Betrag das Guthaben + Überziehungslimit nicht übersteigt; geben Sie im Fehlerfall"Insufficient funds (overdraft limit: $[limit])"zurück, oder"Withdrew: $[amount]"bei ErfolggetOverdraftLimit(): float— gibt das Überziehungslimit zurück
- Einer privaten
Bank.php— Binden Sie beide Kontodateien ein. Erstellen Sie eineBank-Klasse, die Konten verwaltet:- Einem privaten Array zum Speichern von Konten, indiziert nach Kontonummer
addAccount(BankAccount $account): void— fügt ein Konto hinzufindAccount(string $accountNumber): ?BankAccount— gibt das Konto oder null zurücktransfer(string $fromAccount, string $toAccount, float $amount): string— überträgt Geld zwischen Konten. Geben Sie"Source account not found","Destination account not found"oder das Ergebnis der Auszahlung zurück, falls diese fehlschlägt. Bei Erfolg zahlen Sie auf das Zielkonto ein und geben"Transferred $[amount] from [from] to [to]"zurück
main.php— Binden Sie die Bank-Datei ein. Sie erhalten zwei Eingaben: Kontodaten (JSON) und Operationen (JSON).Format des Konten-JSON:
[{"type": "savings", "number": "SAV001", "holder": "Alice", "initial": 1000}, {"type": "checking", "number": "CHK001", "holder": "Bob", "initial": 500, "overdraft": 200}]Format des Operationen-JSON:
[{"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"}]Erstellen Sie die Bank und alle Konten (zahlen Sie die Anfangsbeträge ein). Verarbeiten Sie jede Operation:
"deposit"— Geben Sie das Ergebnis vondeposit()aus"withdraw"— Geben Sie das Ergebnis vonwithdraw()aus"transfer"— Geben Sie das Ergebnis vontransfer()aus"interest"— Geben Sie das Ergebnis vonapplyInterest()aus (nur für Sparkonten)"balance"— Geben Sie"[holder] balance: $[balance]"aus (2 Dezimalstellen)
Geben Sie jedes Ergebnis in einer neuen Zeile aus. Formatieren Sie alle Geldbeträge auf 2 Dezimalstellen.
Denken Sie daran, dass Überweisungen atomar sein sollten — wenn die Auszahlung fehlschlägt, darf die Einzahlung nicht erfolgen. Die geschützte $balance-Eigenschaft ermöglicht es Kindklassen, diese zu ändern, während sie vor externem Code verborgen bleibt, was eine ordnungsgemäße Kapselung im Finanzkontext demonstriert.
Probier es selbst
<?php
require_once 'Bank.php';
// Eingabe lesen
$accountsJson = trim(fgets(STDIN));
$operationsJson = trim(fgets(STDIN));
// JSON-Eingaben parsen
$accounts = (array)json_decode($accountsJson, true);
$operations = (array)json_decode($operationsJson, true);
// TODO: Eine Bank-Instanz erstellen
// TODO: Konten aus den Kontodaten erstellen
// Für jedes Konto in $accounts:
// - Wenn der Typ "savings" ist, SavingsAccount erstellen
// - Wenn der Typ "checking" ist, CheckingAccount erstellen (mit Überziehungsrahmen, falls angegeben)
// - Konto zur Bank hinzufügen
// - Anfangsbetrag einzahlen
// TODO: Jede Operation verarbeiten
// Für jede Operation in $operations:
// - "deposit": Ergebnis von deposit() ausgeben
// - "withdraw": Ergebnis von withdraw() ausgeben
// - "transfer": Ergebnis von transfer() ausgeben
// - "interest": Ergebnis von applyInterest() ausgeben (nur für Sparkonten)
// - "balance": "[holder] balance: $[balance]" ausgeben (2 Dezimalstellen)
?>Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas $this-SchlüsselwortMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick - Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDas parent:: SchlüsselwortMethoden überschreibenDas final SchlüsselwortAbstrakte KlassenZusammenfassung – Mitarbeiter-Hierarchie7Kapselung
Public, Protected, PrivateZugriffsmodifikatoren im DetailGetter und SetterInformation HidingConstructor Promotion (8.0)Zusammenfassung – Studentenverwaltungssystem2Namensräume & Autoloading
Einführung in NamensräumeDas use-SchlüsselwortPSR-4 Autoloading-StandardComposer AutoloaderZusammenfassung – Organisiertes Projekt5Interfaces & Verträge
Einführung in InterfacesInterfaces implementierenMehrfache Interface-ImplementierungInterface vs. Abstrakte KlasseType Hinting mit InterfacesZusammenfassung – Formen-Rechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objekt-Klonen__serialize & __unserializeZusammenfassung - Eigene Collection11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenEigene Exception-HierarchieTry, Catch, FinallyZusammenfassung - Formular-Validator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klasseneigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenReadonly-Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphismus
Method Overriding erneut betrachtetPolymorphismus über InterfacesType Hinting & Union TypesLate Static BindingZusammenfassung – Payment Processor9Traits
Einführung in TraitsVerwendung mehrerer TraitsKonfliktlösung bei TraitsAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung