מחלקות חריגה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 66 מתוך 91.
ב-PHP, חריגות הן אובייקטים שמשמשים לאיתות שמשהו השתבש במהלך ההרצה. מחלקת הבסיס לכל החריגות היא Exception, והבנת המבנה שלה עוזרת לטפל בשגיאות ביעילות ביישומי OOP.
כשזורקים חריגה, יוצרים מופע של המחלקה Exception (או של מחלקת משנה שלה) עם הודעה שמתארת מה השתבש:
<?php
class BankAccount {
public function __construct(private float $balance = 0) {}
public function withdraw(float $amount): float {
if ($amount > $this->balance) {
throw new Exception("Insufficient funds");
}
$this->balance -= $amount;
return $amount;
}
}
$account = new BankAccount(100);
$account->withdraw(150);
פעולה זו תגרום לשגיאת חריגה שלא נתפסה עם ההודעה "Insufficient funds".
PHP מספקת כמה מחלקות חריגות מובנות למצבים שונים. InvalidArgumentException מציינת קלט שגוי, RuntimeException מציינת שגיאות במהלך הביצוע, ו-LogicException מייצגת שגיאות תכנות:
<?php
class Calculator {
public function divide(int $a, int $b): float {
if ($b === 0) {
throw new InvalidArgumentException("Cannot divide by zero");
}
return $a / $b;
}
}
כל אובייקט חריגה מכיל מידע שימושי: getMessage() מחזירה את הודעת השגיאה, getCode() מחזירה קוד שגיאה אופציונלי, ו-getFile() ו-getLine() מציינות היכן החריגה נזרקה. שימוש בסוגי חריגות ספציפיים מבהיר את כוונת הקוד שלך ומאפשר טיפול מדויק יותר בשגיאות.
אתגר
קלבואו נבנה מערכת לניהול מלאי שמשתמשת במחלקות החריגים המובנות של PHP כדי לסמן סוגים שונים של בעיות. תיצרו מלאי מוצרים שבו פעולות עלולות להיכשל בדרכים מסוימות ומשמעותיות.
תארגנו את הקוד בשלושה קבצים:
Product.php: צרו מחלקהProductשמייצגת פריט במלאי. השתמשו בקידום מאפיינים בבנאי עבור$skuציבורי (מחרוזת),$nameציבורי (מחרוזת) ו-$quantityפרטי (מספר שלם). למחלקה שלכם צריכים להיות:- מתודה
getQuantity(): intשמחזירה את הכמות הנוכחית - מתודה
addStock(int $amount): voidשמגדילה את הכמות. אם הכמות קטנה מ-1, זרקוInvalidArgumentExceptionעם ההודעה"Amount must be positive" - מתודה
removeStock(int $amount): voidשמקטינה את הכמות. אם הכמות קטנה מ-1, זרקוInvalidArgumentExceptionעם ההודעה"Amount must be positive". אם הכמות גדולה מהכמות הנוכחית, זרקוRuntimeExceptionעם ההודעה"Insufficient stock"
- מתודה
Inventory.php: צרו מחלקהInventoryשמנהלת אוסף של מוצרים. כללו את קובץ Product. למחלקה שלכם צריכים להיות:- מערך פרטי לאחסון מוצרים, באינדקס לפי SKU
- מתודה
addProduct(Product $product): voidשמוסיפה מוצר. אם כבר קיים מוצר עם אותו SKU, זרקוLogicExceptionעם ההודעה"Product already exists: [sku]" - מתודה
getProduct(string $sku): Productשמחזירה מוצר לפי SKU. אם המוצר לא נמצא, זרקוInvalidArgumentExceptionעם ההודעה"Product not found: [sku]"
main.php: כללו את קובץ Inventory. תקבלו שלושה קלטים: SKU, שם מוצר ופעולה ("add","remove"או"duplicate").צרו
InventoryוהוסיפוProductחדש עם ה-SKU והשם הנתונים, ועם כמות התחלתית של10.בהתאם לפעולה:
"add": קראו ל-addStock(5)עבור המוצר, ואז הדפיסו"Stock updated: [quantity]""remove": קראו ל-removeStock(15)עבור המוצר (פעולה זו אמורה לזרוק חריגה)"duplicate": נסו להוסיף מוצר נוסף עם אותו SKU (פעולה זו אמורה לזרוק חריגה)
כאשר נזרקת חריגה, הדפיסו את שם המחלקה של החריגה ולאחריו
": "ואת הודעת החריגה. השתמשו בפונקציהget_class()של PHP כדי לקבל את שם המחלקה.
האתגר הזה מדגים כיצד סוגים שונים של חריגים מציינים סוגים שונים של בעיות — קלט לא תקין, כשלים בזמן ריצה ושגיאות לוגיות — וכך הופכים את הטיפול בשגיאות בקוד שלכם למדויק ומשמעותי יותר.
נסו בעצמכם
<?php
require_once 'Inventory.php';
// קראו את הקלטים
$sku = trim(fgets(STDIN));
$name = trim(fgets(STDIN));
$operation = trim(fgets(STDIN));
try {
// TODO: צרו Inventory
// TODO: צרו Product עם ה-SKU, השם והכמות ההתחלתית 10 שניתנו
// TODO: הוסיפו את המוצר למלאי
// TODO: בהתאם לפעולה:
// - "add": קראו ל-addStock(5) על המוצר, ואז הדפיסו "Stock updated: [quantity]"
// - "remove": קראו ל-removeStock(15) על המוצר
// - "duplicate": נסו להוסיף מוצר נוסף עם אותו SKU
} catch (Exception $e) {
// TODO: הדפיסו את שם מחלקת החריגה, אחריו ": " ואז את ההודעה
// רמז: השתמשו ב-get_class($e) כדי לקבל את שם המחלקה
}
?>השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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סיכום – אוסף מותאם אישית11מערכת טיפוסים וטיפול בשגיאות
הצהרות טיפוסיםטיפוסים שניתנים להכלה של nullטיפוסי איחוד וחיתוךמחלקות חריגההיררכיית חריגות מותאמת אישיתTry, Catch, Finallyסיכום – מאמת טפסים3מאפייני מחלקה
מאפייני מופע לעומת מאפיינים סטטייםקבועים במחלקותמתודות ומאפיינים סטטייםמאפיינים פרטיים ומוגניםמאפיינים לקריאה בלבד (PHP 8.1)סיכום – מנהל חשבון בנק6פולימורפיזם
בחינה מחדש של דריסת מתודותפולימורפיזם באמצעות ממשקיםרמזי טיפוסים וטיפוסי איחודקישור סטטי מאוחרסיכום — מעבד תשלומיםתרגלו בעצמכם: קומפיילר PHP אונליין