Menu
Coddy logo textTech

Bankingsystem

Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 89 von 91.

challenge icon

Aufgabe

Einfach

Lass uns ein Bankensystem entwickeln, das Konten, Transaktionen und Überweisungen zwischen Konten verwaltet. Du erstellst ein System mit geeigneter Kapselung zum Schutz von Finanzdaten, Vererbung für verschiedene Kontotypen und Validierung, um die Datenintegrität sicherzustellen.

Du organisierst deinen Code auf sechs Dateien verteilt:

  • Transaction.php: Erstelle eine Transaction-Klasse, um Finanzvorgänge zu protokollieren. Verwende Konstruktor-Promotion für type (string: "deposit", "withdrawal" oder "transfer"), amount (float) und timestamp (string). Alle Eigenschaften sollten öffentlich und schreibgeschützt sein. Füge eine Methode getDescription(): string hinzu, die "[type]: $[amount]" zurückgibt (formatiere den Betrag mit 2 Dezimalstellen).
  • BankAccount.php: Binde die Transaction-Datei ein. Erstelle eine abstrakte BankAccount-Klasse mit:
    • Konstruktor-Promotion für accountNumber (string, öffentlich und schreibgeschützt) und holderName (string, öffentlich und schreibgeschützt)
    • Eine geschützte $balance-Eigenschaft, die mit 0.0 initialisiert wird
    • Ein privates Array zum Speichern des Transaktionsverlaufs
    • getBalance(): float: gibt den aktuellen Kontostand zurück
    • deposit(float $amount): string: addiert den Betrag zum Kontostand, protokolliert die Transaktion und gibt "Deposited: $[amount]" zurück
    • abstract withdraw(float $amount): string: Unterklassen implementieren die Regeln für Abhebungen
    • addTransaction(Transaction $t): void: geschützte Methode zum Hinzufügen von Transaktionen zum Verlauf
    • getTransactionCount(): int: gibt die Anzahl der Transaktionen zurück
  • SavingsAccount.php: Binde die BankAccount-Datei ein. Erstelle eine SavingsAccount-Klasse, die BankAccount erweitert, mit:
    • Eine Klassenkonstante INTEREST_RATE, die auf 0.02 (2 %) gesetzt ist
    • withdraw(float $amount): string: Wenn der Betrag den Kontostand übersteigt, gib "Insufficient funds" zurück; andernfalls ziehe den Betrag ab, protokolliere die Transaktion und gib "Withdrew: $[amount]" zurück
    • applyInterest(): string: berechnet die Zinsen auf den aktuellen Kontostand, fügt sie als Einzahlung hinzu und gibt "Interest applied: $[interest]" zurück
  • CheckingAccount.php: Binde die BankAccount-Datei ein. Erstelle eine CheckingAccount-Klasse, die BankAccount erweitert, mit:
    • Eine private $overdraftLimit-Eigenschaft, die über den Konstruktor festgelegt wird (füge einen dritten Parameter mit dem Standardwert 100.0 hinzu)
    • withdraw(float $amount): string: erlaubt eine Abhebung, wenn der Betrag den Kontostand plus das Überziehungslimit nicht überschreitet; gib bei einem Fehlschlag "Insufficient funds (overdraft limit: $[limit])" oder bei Erfolg "Withdrew: $[amount]" zurück
    • getOverdraftLimit(): float: gibt das Überziehungslimit zurück
  • Bank.php: Binde beide Kontodateien ein. Erstelle eine Bank-Klasse, die Konten verwaltet:
    • Ein privates Array zum Speichern von Konten, indiziert nach Kontonummer
    • addAccount(BankAccount $account): void: fügt ein Konto hinzu
    • findAccount(string $accountNumber): ?BankAccount: gibt das Konto oder null zurück
    • transfer(string $fromAccount, string $toAccount, float $amount): string: überweist Geld zwischen Konten. Gib "Source account not found", "Destination account not found" oder bei einem Fehlschlag das Ergebnis der Abhebung zurück. Bei Erfolg zahle auf das Zielkonto ein und gib "Transferred $[amount] from [from] to [to]" zurück
  • main.php: Binde die Bank-Datei ein. Du erhältst zwei Eingaben: Kontodaten (JSON) und Vorgänge (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 Vorgänge-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"}]

    Erstelle die Bank und alle Konten (indem du die Anfangsbeträge einzahlst). Verarbeite jeden Vorgang:

    • "deposit": Gib das Ergebnis von deposit() aus
    • "withdraw": Gib das Ergebnis von withdraw() aus
    • "transfer": Gib das Ergebnis von transfer() aus
    • "interest": Gib das Ergebnis von applyInterest() aus (nur für Sparkonten)
    • "balance": Gib "[holder] balance: $[balance]" aus (2 Dezimalstellen)

    Gib jedes Ergebnis in einer neuen Zeile aus. Formatiere alle Geldbeträge mit 2 Dezimalstellen.

Denke daran, dass Überweisungen atomar sein sollten: Wenn die Abhebung fehlschlägt, darf die Einzahlung nicht erfolgen. Die geschützte $balance-Eigenschaft ermöglicht es Unterklassen, sie zu ändern, während sie vor externem Code verborgen bleibt, und veranschaulicht damit eine geeignete Kapselung im finanziellen Kontext.

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 Typ "savings" ist, SavingsAccount erstellen
//   - Wenn Typ "checking" ist, CheckingAccount erstellen (mit Überziehung, 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 savings)
//   - "balance": "[holder] balance: $[balance]" ausgeben (2 Dezimalstellen)

?>

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-PHP-Compiler