מערכת בנקאית
חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 89 מתוך 91.
אתגר
קלבואו נבנה מערכת בנקאית שמטפלת בחשבונות, בעסקאות ובהעברות בין חשבונות. תיצרו מערכת עם כימוס מתאים כדי להגן על נתונים פיננסיים, ירושה עבור סוגי חשבונות שונים ואימות כדי להבטיח את שלמות הנתונים.
תארגנו את הקוד שלכם בשישה קבצים:
Transaction.php: צרו מחלקה בשםTransactionלתיעוד פעולות פיננסיות. השתמשו בקידום מאפיינים בבנאי עבורtype(מחרוזת: "deposit", "withdrawal", או "transfer"),amount(מספר ממשי) ו-timestamp(מחרוזת). כל המאפיינים צריכים להיות public readonly. הוסיפו מתודהgetDescription(): stringשמחזירה"[type]: $[amount]"(עצבו את הסכום עם 2 ספרות אחרי הנקודה העשרונית).BankAccount.php: כללו את קובץ Transaction. צרו מחלקה מופשטת בשםBankAccountעם:- קידום מאפיינים בבנאי עבור
accountNumber(מחרוזת, public readonly) ועבורholderName(מחרוזת, public readonly) - מאפיין מוגן
$balanceשמאותחל ל-0.0 - מערך פרטי לאחסון היסטוריית העסקאות
getBalance(): float: מחזירה את היתרה הנוכחיתdeposit(float $amount): string: מוסיפה ליתרה, מתעדת עסקה ומחזירה"Deposited: $[amount]"abstract withdraw(float $amount): string: מחלקות הבת מממשות את כללי המשיכהaddTransaction(Transaction $t): void: מתודה מוגנת להוספת עסקאות להיסטוריהgetTransactionCount(): int: מחזירה את מספר העסקאות
- קידום מאפיינים בבנאי עבור
SavingsAccount.php: כללו את קובץ BankAccount. צרו מחלקה בשםSavingsAccountשיורשת מ-BankAccountעם:- קבוע מחלקה
INTEREST_RATEשמוגדר ל-0.02 (2%) withdraw(float $amount): string: אם הסכום עולה על היתרה, החזירו"Insufficient funds"; אחרת, הפחיתו את הסכום, תעדו עסקה והחזירו"Withdrew: $[amount]"applyInterest(): string: מחשבת ריבית על היתרה הנוכחית, מוסיפה אותה כהפקדה ומחזירה"Interest applied: $[interest]"
- קבוע מחלקה
CheckingAccount.php: כללו את קובץ BankAccount. צרו מחלקה בשםCheckingAccountשיורשת מ-BankAccountעם:- מאפיין פרטי
$overdraftLimitשמוגדר באמצעות הבנאי (הוסיפו פרמטר שלישי עם ערך ברירת מחדל 100.0) withdraw(float $amount): string: מאפשרת משיכה אם הסכום אינו עולה על היתרה בתוספת מסגרת האשראי; במקרה של כישלון החזירו"Insufficient funds (overdraft limit: $[limit])", או"Withdrew: $[amount]"במקרה של הצלחהgetOverdraftLimit(): float: מחזירה את מסגרת האשראי
- מאפיין פרטי
Bank.php: כללו את שני קובצי החשבונות. צרו מחלקה בשםBankשמנהלת חשבונות:- מערך פרטי לאחסון חשבונות, כשהמפתח הוא מספר החשבון
addAccount(BankAccount $account): void: מוסיפה חשבוןfindAccount(string $accountNumber): ?BankAccount: מחזירה חשבון או nulltransfer(string $fromAccount, string $toAccount, float $amount): string: מעבירה כסף בין חשבונות. החזירו"Source account not found","Destination account not found"או את תוצאת המשיכה אם היא נכשלת. במקרה של הצלחה, הפקידו בחשבון היעד והחזירו"Transferred $[amount] from [from] to [to]"
main.php: כללו את קובץ Bank. תקבלו שתי קלטים: נתוני חשבונות (JSON) ופעולות (JSON).מבנה ה-JSON של החשבונות:
[{"type": "savings", "number": "SAV001", "holder": "Alice", "initial": 1000}, {"type": "checking", "number": "CHK001", "holder": "Bob", "initial": 500, "overdraft": 200}]מבנה ה-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"}]צרו את הבנק ואת כל החשבונות (והפקידו את הסכומים ההתחלתיים). עבדו על כל פעולה:
"deposit": הדפיסו את התוצאה שלdeposit()"withdraw": הדפיסו את התוצאה שלwithdraw()"transfer": הדפיסו את התוצאה שלtransfer()"interest": הדפיסו את התוצאה שלapplyInterest()(רק עבור חשבונות חיסכון)"balance": הדפיסו"[holder] balance: $[balance]"(2 ספרות אחרי הנקודה העשרונית)
הדפיסו כל תוצאה בשורה חדשה. עצבו את כל הסכומים הכספיים עם 2 ספרות אחרי הנקודה העשרונית.
זכרו שהעברות צריכות להיות אטומיות: אם המשיכה נכשלת, ההפקדה לא צריכה להתבצע. המאפיין המוגן $balance מאפשר למחלקות הבת לשנות אותו תוך הסתרתו מקוד חיצוני, ובכך מדגים כימוס מתאים בהקשר פיננסי.
נסו בעצמכם
<?php
require_once 'Bank.php';
// קרא את הקלט
$accountsJson = trim(fgets(STDIN));
$operationsJson = trim(fgets(STDIN));
// פענח את קלטי JSON
$accounts = (array)json_decode($accountsJson, true);
$operations = (array)json_decode($operationsJson, true);
// TODO: צור מופע של Bank
// TODO: צור חשבונות מנתוני החשבונות
// עבור כל חשבון ב-$accounts:
// - אם הסוג הוא "savings", צור SavingsAccount
// - אם הסוג הוא "checking", צור CheckingAccount (עם מסגרת משיכת יתר אם צוינה)
// - הוסף את החשבון לבנק
// - הפקד את הסכום ההתחלתי
// TODO: עבד כל פעולה
// עבור כל פעולה ב-$operations:
// - "deposit": הדפס את התוצאה של deposit()
// - "withdraw": הדפס את התוצאה של withdraw()
// - "transfer": הדפס את התוצאה של transfer()
// - "interest": הדפס את התוצאה של applyInterest() (רק עבור חשבונות חיסכון)
// - "balance": הדפס "[holder] balance: $[balance]" (עם 2 ספרות אחרי הנקודה העשרונית)
?>כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים (OOP)
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח $thisמתודותמאפייניםבנאי (__construct)הורס (__destruct)חזרה: מחשבון פשוט4ירושה
ירושה בסיסיתמילת המפתח parent::דריסת מתודותמילת המפתח finalמחלקות מופשטותסיכום – היררכיית עובדים7כימוס
ציבורי, מוגן, פרטימפרטי גישה לעומקמתודות גישה ועדכוןהסתרת מידעקידום פרמטרים בבנאי (8.0)סיכום – מערכת רישומי תלמידים2מרחבי שמות וטעינה אוטומטית
מבוא למרחבי שמותמילת המפתח useתקן הטעינה האוטומטית PSR-4הטוען האוטומטי של Composerסיכום – פרויקט מאורגן5ממשקים וחוזים
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםממשק לעומת מחלקה מופשטתרמזי טיפוסים עם ממשקיםסיכום - מחשבון צורות8מתודות קסם
מבוא למתודות קסם__toString ו־__debugInfo__get, __set, __isset, __unset__call ו־__callStatic__clone ושיבוט אובייקטים__serialize ו־__unserializeסיכום – אוסף מותאם אישית3מאפייני מחלקה
מאפייני מופע לעומת מאפיינים סטטייםקבועים במחלקותמתודות ומאפיינים סטטייםמאפיינים פרטיים ומוגניםמאפיינים לקריאה בלבד (PHP 8.1)סיכום – מנהל חשבון בנק6פולימורפיזם
בחינה מחדש של דריסת מתודותפולימורפיזם באמצעות ממשקיםרמזי טיפוסים וטיפוסי איחודקישור סטטי מאוחרסיכום — מעבד תשלומיםתרגלו בעצמכם: קומפיילר PHP אונליין