Sistem Perbankan
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 89 dari 91.
Tantangan
MudahMari kita bangun Sistem Perbankan yang menangani rekening, transaksi, dan transfer antarrekening. Kamu akan membuat sistem dengan enkapsulasi yang tepat untuk melindungi data keuangan, pewarisan untuk berbagai jenis rekening, dan validasi untuk memastikan integritas data.
Kamu akan mengatur kodemu dalam enam file:
Transaction.php: Buat classTransactionuntuk mencatat operasi keuangan. Gunakan promosi konstruktor untuktype(string: "deposit", "withdrawal", atau "transfer"),amount(float), dantimestamp(string). Semua property harus bersifat public readonly. Tambahkan methodgetDescription(): stringyang mengembalikan"[type]: $[amount]"(format nilai amount hingga 2 angka desimal).BankAccount.php: Sertakan file Transaction. Buat class abstrakBankAccountdengan:- Promosi konstruktor untuk
accountNumber(string, public readonly) danholderName(string, public readonly) - Property
$balanceprotected yang diinisialisasi ke 0.0 - Array private untuk menyimpan riwayat transaksi
getBalance(): float: mengembalikan saldo saat inideposit(float $amount): string: menambahkan ke saldo, mencatat transaksi, dan mengembalikan"Deposited: $[amount]"abstract withdraw(float $amount): string: class anak menerapkan aturan penarikanaddTransaction(Transaction $t): void: method protected untuk menambahkan transaksi ke riwayatgetTransactionCount(): int: mengembalikan jumlah transaksi
- Promosi konstruktor untuk
SavingsAccount.php: Sertakan file BankAccount. Buat classSavingsAccountyang mewarisiBankAccountdengan:- Konstanta class
INTEREST_RATEyang ditetapkan ke 0.02 (2%) withdraw(float $amount): string: jika amount melebihi saldo, kembalikan"Insufficient funds"; jika tidak, kurangi saldo, catat transaksi, lalu kembalikan"Withdrew: $[amount]"applyInterest(): string: menghitung bunga berdasarkan saldo saat ini, menambahkannya sebagai deposit, lalu mengembalikan"Interest applied: $[interest]"
- Konstanta class
CheckingAccount.php: Sertakan file BankAccount. Buat classCheckingAccountyang mewarisiBankAccountdengan:- Property
$overdraftLimitprivate yang ditetapkan melalui konstruktor (tambahkan parameter ketiga dengan nilai default 100.0) withdraw(float $amount): string: mengizinkan penarikan jika amount tidak melebihi saldo + batas overdraft; kembalikan"Insufficient funds (overdraft limit: $[limit])"jika gagal, atau"Withdrew: $[amount]"jika berhasilgetOverdraftLimit(): float: mengembalikan batas overdraft
- Property
Bank.php: Sertakan kedua file rekening. Buat classBankyang mengelola rekening:- Array private untuk menyimpan rekening yang diindeks berdasarkan nomor rekening
addAccount(BankAccount $account): void: menambahkan rekeningfindAccount(string $accountNumber): ?BankAccount: mengembalikan rekening atau nulltransfer(string $fromAccount, string $toAccount, float $amount): string: mentransfer uang antar rekening. Kembalikan"Source account not found","Destination account not found", atau hasil penarikan jika gagal. Jika berhasil, lakukan deposit ke rekening tujuan dan kembalikan"Transferred $[amount] from [from] to [to]"
main.php: Sertakan file Bank. Kamu akan menerima dua input: data rekening (JSON) dan operasi (JSON).Format JSON rekening:
[{"type": "savings", "number": "SAV001", "holder": "Alice", "initial": 1000}, {"type": "checking", "number": "CHK001", "holder": "Bob", "initial": 500, "overdraft": 200}]Format JSON operasi:
[{"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"}]Buat bank dan semua rekening (dengan menyetorkan saldo awal). Proses setiap operasi:
"deposit": Cetak hasildeposit()"withdraw": Cetak hasilwithdraw()"transfer": Cetak hasiltransfer()"interest": Cetak hasilapplyInterest()(hanya untuk rekening tabungan)"balance": Cetak"[holder] balance: $[balance]"(2 angka desimal)
Cetak setiap hasil pada baris baru. Format semua jumlah uang hingga 2 angka desimal.
Ingat bahwa transfer harus bersifat atomik. Jika penarikan gagal, deposit tidak boleh dilakukan. Property $balance yang protected memungkinkan class anak mengubahnya, sementara tetap menyembunyikannya dari kode luar. Ini menunjukkan enkapsulasi yang tepat dalam konteks keuangan.
Coba sendiri
<?php
require_once 'Bank.php';
// Baca input
$accountsJson = trim(fgets(STDIN));
$operationsJson = trim(fgets(STDIN));
// Uraikan input JSON
$accounts = (array)json_decode($accountsJson, true);
$operations = (array)json_decode($operationsJson, true);
// TODO: Buat instance Bank
// TODO: Buat akun dari data akun
// Untuk setiap akun dalam $accounts:
// - Jika tipe adalah "savings", buat SavingsAccount
// - Jika tipe adalah "checking", buat CheckingAccount (dengan overdraft jika tersedia)
// - Tambahkan akun ke bank
// - Setorkan jumlah awal
// TODO: Proses setiap operasi
// Untuk setiap operasi dalam $operations:
// - "deposit": Cetak hasil deposit()
// - "withdraw": Cetak hasil dari withdraw()
// - "transfer": Cetak hasil dari transfer()
// - "interest": Cetak hasil dari applyInterest() (hanya untuk rekening tabungan)
// - "balance": Cetak "[holder] balance: $[balance]" (2 angka di belakang koma)
?>Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengenalan OOPclass vs objectKata Kunci $thismethodpropertyConstructor (__construct)Destructor (__destruct)Ringkasan: Kalkulator Sederhana4Pewarisan
Pewarisan DasarKata Kunci parent::Penimpaan methodKata Kunci finalClass AbstrakRingkasan: Hierarki Karyawan7Enkapsulasi
Public, Protected, PrivateModifier Akses secara MendalamGetter dan SetterPenyembunyian InformasiPromosi Constructor (8.0)Ulasan: Sistem Catatan Siswa2Namespace dan Autoloading
Pengenalan NamespaceKata Kunci useStandar Autoloading PSR-4Autoloader ComposerRingkasan: Proyek yang Terorganisasi5Interface dan Kontrak
Pengenalan InterfaceMengimplementasikan InterfaceImplementasi Beberapa InterfaceInterface vs Abstract ClassPetunjuk Tipe dengan InterfaceRekap: Kalkulator Bentuk8Magic Methods
Pengantar Magic Methods__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Cloning Object__serialize & __unserializeRingkasan: Koleksi Kustom11Sistem Tipe Data dan Penanganan Error
Deklarasi TipeTipe NullableTipe Union dan IntersectionClass ExceptionHierarki Exception KustomTry, Catch, FinallyRekap: Validator Form3Property dalam class
Property instance vs staticKonstanta dalam classMethod & property staticProperty private & protectedProperty readonly (PHP 8.1)Ulasan: Pengelola Rekening Bank6Polimorfisme
Meninjau Kembali Method OverridingPolimorfisme melalui AntarmukaPetunjuk Tipe dan Tipe UnionPengikatan Statis TertundaRangkuman: Pemroses Pembayaran9Trait
Pengantar TraitMenggunakan Beberapa TraitResolusi Konflik TraitMetode Abstrak dalam TraitTrait vs Pewarisan15Tantangan Akhir
Platform E-LearningSistem PerbankanPengembangan Karakter GameLayanan Penyewaan KendaraanLatihan sendiri: Compiler PHP online