Bankacılık Sistemi
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 89 / 91.
Görev
KolayHesapları, işlemleri ve hesaplar arasındaki transferleri yöneten bir Bankacılık Sistemi oluşturalım. Finansal verileri korumak için uygun kapsülleme, farklı hesap türleri için kalıtım ve veri bütünlüğünü sağlamak için doğrulama içeren bir sistem oluşturacaksınız.
Kodunuzu altı dosya arasında düzenleyeceksiniz:
Transaction.php: Finansal işlemleri kaydetmek için birTransactionsınıfı oluşturun.type(string: "deposit", "withdrawal" veya "transfer"),amount(float) vetimestamp(string) için yapıcı destekli özellik tanımlamasını kullanın. Tüm özellikler public readonly olmalıdır.getDescription(): stringmetodunu ekleyin; bu metot"[type]: $[amount]"değerini döndürmelidir (amount değerini 2 ondalık basamağa biçimlendirin).BankAccount.php: Transaction dosyasını dahil edin. Aşağıdakilere sahip soyut birBankAccountsınıfı oluşturun:accountNumber(string, public readonly) veholderName(string, public readonly) için yapıcı destekli özellik tanımlaması- 0.0 olarak başlatılan korumalı bir
$balanceözelliği - İşlem geçmişini depolamak için özel bir dizi
getBalance(): float: mevcut bakiyeyi döndürürdeposit(float $amount): string: bakiyeye ekleme yapar, işlemi kaydeder ve"Deposited: $[amount]"değerini döndürürabstract withdraw(float $amount): string: alt sınıflar para çekme kurallarını uygularaddTransaction(Transaction $t): void: işlem geçmişine işlem ekleyen korumalı metotgetTransactionCount(): int: işlem sayısını döndürür
SavingsAccount.php: BankAccount dosyasını dahil edin. Aşağıdakilere sahip veSavingsAccountsınıfını genişleten birBankAccountsınıfı oluşturun:- 0.02 (%2) olarak ayarlanmış bir
INTEREST_RATEsınıf sabiti withdraw(float $amount): string: amount bakiyeyi aşarsa"Insufficient funds"değerini döndürür; aksi takdirde bakiyeden düşer, işlemi kaydeder ve"Withdrew: $[amount]"değerini döndürürapplyInterest(): string: mevcut bakiye üzerinden faizi hesaplar, bunu bir para yatırma işlemi olarak ekler ve"Interest applied: $[interest]"değerini döndürür
- 0.02 (%2) olarak ayarlanmış bir
CheckingAccount.php: BankAccount dosyasını dahil edin. Aşağıdakilere sahip veCheckingAccountsınıfını genişleten birBankAccountsınıfı oluşturun:- Yapıcı aracılığıyla ayarlanan özel bir
$overdraftLimitözelliği (varsayılan değeri 100.0 olan üçüncü bir parametre ekleyin) withdraw(float $amount): string: amount, bakiye + kredili mevduat limitini aşmıyorsa para çekilmesine izin verir; başarısızlık durumunda"Insufficient funds (overdraft limit: $[limit])", başarı durumunda ise"Withdrew: $[amount]"değerini döndürürgetOverdraftLimit(): float: kredili mevduat limitini döndürür
- Yapıcı aracılığıyla ayarlanan özel bir
Bank.php: Her iki hesap dosyasını da dahil edin. Hesapları yöneten birBanksınıfı oluşturun:- Hesap numarasına göre indekslenmiş hesapları depolamak için özel bir dizi
addAccount(BankAccount $account): void: bir hesap eklerfindAccount(string $accountNumber): ?BankAccount: hesabı veya null değerini döndürürtransfer(string $fromAccount, string $toAccount, float $amount): string: hesaplar arasında para transferi yapar."Source account not found","Destination account not found"değerlerinden birini veya başarısız olması durumunda para çekme işleminin sonucunu döndürür. Başarılı olursa hedef hesaba para yatırır ve"Transferred $[amount] from [from] to [to]"değerini döndürür
main.php: Bank dosyasını dahil edin. İki girdi alacaksınız: hesap verileri (JSON) ve işlemler (JSON).Hesaplar için JSON biçimi:
[{"type": "savings", "number": "SAV001", "holder": "Alice", "initial": 1000}, {"type": "checking", "number": "CHK001", "holder": "Bob", "initial": 500, "overdraft": 200}]İşlemler için JSON biçimi:
[{"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"}]Bankayı ve tüm hesapları oluşturun (başlangıç tutarlarını yatırarak). Her işlemi işleyin:
"deposit":deposit()sonucunu yazdırın"withdraw":withdraw()sonucunu yazdırın"transfer":transfer()sonucunu yazdırın"interest":applyInterest()sonucunu yazdırın (yalnızca tasarruf hesapları için)"balance":"[holder] balance: $[balance]"değerini yazdırın (2 ondalık basamak)
Her sonucu yeni bir satıra yazdırın. Tüm parasal tutarları 2 ondalık basamağa biçimlendirin.
Transferlerin atomik olması gerektiğini unutmayın; para çekme işlemi başarısız olursa para yatırma işlemi gerçekleşmemelidir. Korumalı $balance özelliği, alt sınıfların bu özelliği değiştirmesine izin verirken dış koddan gizli kalmasını sağlar ve böylece finansal bir bağlamda uygun kapsüllemeyi gösterir.
Kendin dene
<?php
require_once 'Bank.php';
// Girdiyi oku
$accountsJson = trim(fgets(STDIN));
$operationsJson = trim(fgets(STDIN));
// JSON girdilerini ayrıştır
$accounts = (array)json_decode($accountsJson, true);
$operations = (array)json_decode($operationsJson, true);
// TODO: Bir Bank örneği oluştur
// TODO: Hesap verilerinden hesaplar oluştur
// $accounts içindeki her hesap için:
// - Tip "savings" ise, SavingsAccount oluştur
// - Tip "checking" ise, CheckingAccount oluştur (sağlanmışsa overdraft ile)
// - Hesabı bankaya ekle
// - Başlangıç tutarını yatır
// TODO: Her işlemi işle
// $operations içindeki her işlem için:
// - "deposit": deposit() sonucunu yazdır
// - "withdraw": withdraw() sonucunu yazdır
// - "transfer": transfer() sonucunu yazdır
// - "interest": applyInterest() sonucunu yazdır (yalnızca savings için)
// - "balance": "[holder] balance: $[balance]" yazdır (2 ondalık basamak)
?>Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi