Menu
Coddy logo textTech

Banksystem

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

challenge icon

Aufgabe

Einfach

Lassen 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 eine Transaction-Klasse, um Finanzoperationen aufzuzeichnen. Verwenden Sie Constructor Promotion für type (string — "deposit", "withdrawal" oder "transfer"), amount (float) und timestamp (string). Alle Eigenschaften sollten public readonly sein. Fügen Sie eine Methode getDescription(): string hinzu, die "[type]: $[amount]" zurückgibt (formatieren Sie den Betrag auf 2 Dezimalstellen).
  • BankAccount.php — Binden Sie die Transaction-Datei ein. Erstellen Sie eine abstrakte BankAccount-Klasse mit:
    • Constructor Promotion für accountNumber (string, public readonly) und holderName (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ück
    • deposit(float $amount): string — fügt dem Kontostand hinzu, zeichnet die Transaktion auf, gibt "Deposited: $[amount]" zurück
    • abstract withdraw(float $amount): string — Kindklassen implementieren die Auszahlungsregeln
    • 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 — Binden Sie die BankAccount-Datei ein. Erstellen Sie eine SavingsAccount-Klasse, die BankAccount erweitert, 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ück
    • applyInterest(): string — berechnet Zinsen auf das aktuelle Guthaben, fügt diese als Einzahlung hinzu und gibt "Interest applied: $[interest]" zurück
  • CheckingAccount.php — Binden Sie die BankAccount-Datei ein. Erstellen Sie eine CheckingAccount-Klasse, die BankAccount erweitert, 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 Erfolg
    • getOverdraftLimit(): float — gibt das Überziehungslimit zurück
  • Bank.php — Binden Sie beide Kontodateien ein. Erstellen Sie eine Bank-Klasse, die Konten verwaltet:
    • Einem privaten 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 — ü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 von deposit() aus
    • "withdraw" — Geben Sie das Ergebnis von withdraw() aus
    • "transfer" — Geben Sie das Ergebnis von transfer() aus
    • "interest" — Geben Sie das Ergebnis von applyInterest() 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