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ı transferleri yöneten bir Banka Sistemi oluşturalım. Finansal verileri korumak için uygun kapsülleme (encapsulation), farklı hesap türleri için kalıtım (inheritance) ve veri bütünlüğünü sağlamak için doğrulama içeren bir sistem oluşturacaksınız.
Kodunuzu altı dosya halinde 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 constructor promotion kullanın. Tüm özellikler public readonly olmalıdır."[type]: $[amount]"döndüren (tutarı 2 ondalık basamağa göre formatlayın) birgetDescription(): stringmetodu ekleyin.BankAccount.php— Transaction dosyasını dahil edin. Aşağıdaki özelliklere sahip soyut birBankAccountsınıfı oluşturun:accountNumber(string, public readonly) veholderName(string, public readonly) için constructor promotion- 0.0 olarak başlatılan korumalı (protected) bir
$balanceözelliği - İşlem geçmişini saklamak için özel (private) bir dizi
getBalance(): float— mevcut bakiyeyi döndürürdeposit(float $amount): string— bakiyeye ekleme yapar, işlemi kaydeder,"Deposited: $[amount]"döndürürabstract withdraw(float $amount): string— alt sınıflar para çekme kurallarını uygularaddTransaction(Transaction $t): void— geçmişe işlem eklemek için korumalı (protected) metodgetTransactionCount(): int— işlem sayısını döndürür
SavingsAccount.php— BankAccount dosyasını dahil edin.BankAccountsınıfını genişleten birSavingsAccountsınıfı oluşturun:- 0.02 (%2) olarak ayarlanmış bir sınıf sabiti (class constant)
INTEREST_RATE withdraw(float $amount): string— tutar bakiyeyi aşarsa"Insufficient funds"döndürür; aksi takdirde tutarı düşer, işlemi kaydeder,"Withdrew: $[amount]"döndürürapplyInterest(): string— mevcut bakiye üzerinden faiz hesaplar, bunu bir mevduat (deposit) olarak ekler,"Interest applied: $[interest]"döndürür
- 0.02 (%2) olarak ayarlanmış bir sınıf sabiti (class constant)
CheckingAccount.php— BankAccount dosyasını dahil edin.BankAccountsınıfını genişleten birCheckingAccountsınıfı oluşturun:- Yapıcı (constructor) aracılığıyla ayarlanan özel (private) bir
$overdraftLimitözelliği (varsayılan değeri 100.0 olan üçüncü bir parametre ekleyin) withdraw(float $amount): string— tutar bakiye + kredili mevduat limitini (overdraft limit) aşmıyorsa para çekmeye izin verir; başarısızlık durumunda"Insufficient funds (overdraft limit: $[limit])", başarı durumunda"Withdrew: $[amount]"döndürürgetOverdraftLimit(): float— kredili mevduat limitini döndürür
- Yapıcı (constructor) aracılığıyla ayarlanan özel (private) 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ı saklamak için özel (private) bir dizi
addAccount(BankAccount $account): void— bir hesap eklerfindAccount(string $accountNumber): ?BankAccount— hesabı veya null döndürürtransfer(string $fromAccount, string $toAccount, float $amount): string— hesaplar arası para transferi yapar."Source account not found","Destination account not found"veya başarısız olursa para çekme işleminin sonucunu döndürür. Başarılı olursa, hedef hesaba yatırın ve"Transferred $[amount] from [from] to [to]"döndürün
main.php— Bank dosyasını dahil edin. İki girdi alacaksınız: hesap verileri (JSON) ve işlemler (JSON).Hesaplar JSON formatı:
[{"type": "savings", "number": "SAV001", "holder": "Alice", "initial": 1000}, {"type": "checking", "number": "CHK001", "holder": "Bob", "initial": 500, "overdraft": 200}]İşlemler JSON formatı:
[{"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]"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 göre formatlayın.
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ı (protected) $balance özelliği, alt sınıfların bu özelliği değiştirmesine izin verirken dış koddan gizli tutulmasını sağlar ve finansal bir bağlamda uygun kapsüllemeyi (encapsulation) 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şturun
// TODO: Hesap verilerinden hesapları oluşturun
// $accounts içindeki her bir hesap için:
// - Tür "savings" ise, SavingsAccount oluşturun
// - Tür "checking" ise, CheckingAccount oluşturun (varsa kredili mevduat ile)
// - Hesabı bankaya ekleyin
// - Başlangıç tutarını yatırın
// TODO: Her bir işlemi gerçekleştirin
// $operations içindeki her bir işlem için:
// - "deposit": deposit() sonucunu yazdırın
// - "withdraw": withdraw() sonucunu yazdırın
// - "transfer": transfer() sonucunu yazdırın
// - "interest": applyInterest() sonucunu yazdırın (sadece birikim hesapları için)
// - "balance": "[holder] balance: $[balance]" yazdırın (2 ondalık basamaklı)
?>Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar KelimesiMetotlarÖzelliklerYapıcı Metot (__construct)Yıkıcı Metot (__destruct)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar KelimesiMetot Geçersiz Kılmafinal Anahtar KelimesiSoyut SınıflarÖzet - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicilere Derinlemesine BakışGetter ve Setter MetotlarıBilgi GizlemeConstructor Promotion (8.0)Özet - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımDependency InjectionAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlama: Derinlemesine İncelemeGenerator'lar ve Iterator'lar13Tasarı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ıKompozit KalıbıRepository Kalıbı2İsim Alanları ve Autoloading
İsim Alanlarına Girişuse Anahtar KelimesiPSR-4 Autoloading StandartıComposer AutoloaderÖzet - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Fazla Arayüz UygulamaArayüz vs Soyut SınıfArayüzler ile Tip BelirlemeÖzet - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Nesne Klonlama__serialize & __unserializeÖzet - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerReadonly Özellikler (PHP 8.1)Özet - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmaya Yeniden BakışArayüzler ile Çok BiçimlilikType Hinting ve Union TypesLate Static BindingÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişÇoklu Trait KullanımıTrait Çakışma ÇözümüTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım12Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı15Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi