טיפוסי Enum (PHP 8.1)
חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 59 מתוך 91.
לפני PHP 8.1, ייצוג של קבוצה קבועה של ערכים, כמו סטטוסים או סוגים, דרש שימוש בקבועים של מחלקה או במחרוזות קסם — שתי גישות מועדות לשגיאות. Enums (מנייה) מספקות דרך הולמת להגדיר טיפוס שיכול להכיל רק ערכים מסוימים שהוגדרו מראש.
מגדירים enum באמצעות מילת המפתח enum:
<?php
enum Status {
case Pending;
case Active;
case Completed;
}
$status = Status::Active;
echo $status->name;
פלט:
Activeל-enum יכולים להיות גם ערכי גיבוי — ערכי מחרוזת או מספר שלם המשויכים לכל מקרה. הדבר שימושי כשמאחסנים enum-ים במסדי נתונים או בממשקי API:
<?php
enum Status: string {
case Pending = 'pending';
case Active = 'active';
case Completed = 'completed';
}
$status = Status::Active;
echo $status->value;
פלט:
activeל-enum-ים מגובי ערכים יש מתודת from() ליצירת enum מתוך הערך שלו, וכן מתודת tryFrom() שמחזירה null במקום לזרוק שגיאה עבור ערכים לא תקינים:
<?php
$status = Status::from('active'); // מחזיר Status::Active
$invalid = Status::tryFrom('unknown'); // מחזיר null
טיפוסים בני-מנייה יכולים להכיל גם מתודות, מה שהופך אותם לכלי רב-עוצמה לאיגוד של לוגיקה קשורה. הם עובדים בצורה חלקה עם רמזי טיפוסים, ומבטיחים שהפונקציות שלך יקבלו רק ערכים תקינים — אין עוד צורך לבדוק אם מחרוזת תואמת לאפשרויות הצפויות.
אתגר
קלבואו נבנה מערכת לניהול הזמנות שמשתמשת במנויים כדי לייצג את סטטוסי ההזמנות באופן בטוח מבחינת טיפוסים. במקום להסתמך על מחרוזות שעלולות להכיל שגיאות כתיב או להיות לא תקינות, תיצרו מנוי מגובה שממפה כל סטטוס לערך ידידותי למסד נתונים.
תארגנו את הקוד שלכם בשלושה קבצים:
OrderStatus.php: צרו מנוי מגובה במחרוזות בשםOrderStatusובו ארבעה מצבים:Pendingמגובה בערך'pending'Processingמגובה בערך'processing'Shippedמגובה בערך'shipped'Deliveredמגובה בערך'delivered'
label()שמחזירה תיאור קריא לאדם עבור כל סטטוס:- עבור Pending מוחזר
"Awaiting confirmation" - עבור Processing מוחזר
"Being prepared" - עבור Shipped מוחזר
"On the way" - עבור Delivered מוחזר
"Order complete"
Order.php: צרו מחלקה בשםOrderשמשתמשת במנוי. כללו את הקובץ OrderStatus. המחלקה צריכה:- לקבל בבנאי מזהה הזמנה (מחרוזת) וערך מסוג
OrderStatus, באמצעות קידום מאפיינים בבנאי - להכיל מתודה
getInfo()שמחזירה"Order [id]: [status label]" - להכיל מתודה
getStatusValue()שמחזירה את הערך המגובה של הסטטוס (שימושי לאחסון במסד נתונים)
- לקבל בבנאי מזהה הזמנה (מחרוזת) וערך מסוג
main.php: כללו את הקובץ Order. תקבלו שתי קלטים: מזהה הזמנה ומחרוזת סטטוס (כמו"shipped"). השתמשו ב-tryFrom()כדי להמיר בבטחה את מחרוזת הקלט למנויOrderStatus. אם הסטטוס תקין, צרוOrderוהדפיסו שתי שורות:- התוצאה של
getInfo() - התוצאה של
getStatusValue()
"Invalid status".- התוצאה של
האתגר הזה מדגים כיצד מנויים מספקים בטיחות טיפוסים. המחלקה Order שלכם יכולה לקבל רק סטטוסים תקינים, והמתודה tryFrom() מאפשרת לכם לטפל בבטחה בקלט מהמשתמש בלי להסתכן בערכים לא תקינים.
נסו בעצמכם
<?php
require_once 'Order.php';
// קראו את הקלט
$orderId = trim(fgets(STDIN));
$statusString = trim(fgets(STDIN));
// TODO: השתמשו ב-OrderStatus::tryFrom() כדי להמיר בבטחה את מחרוזת הסטטוס ל-enum
// tryFrom() מחזירה null אם הערך אינו תקין
// TODO: אם הסטטוס תקין, צרו Order והדפיסו:
// - את התוצאה של getInfo()
// - את התוצאה של getStatusValue()
// TODO: אם הסטטוס אינו תקין, הדפיסו "Invalid status"
?>השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים (OOP)
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח $thisמתודותמאפייניםבנאי (__construct)הורס (__destruct)חזרה: מחשבון פשוט4ירושה
ירושה בסיסיתמילת המפתח parent::דריסת מתודותמילת המפתח finalמחלקות מופשטותסיכום – היררכיית עובדים7כימוס
ציבורי, מוגן, פרטימפרטי גישה לעומקמתודות גישה ועדכוןהסתרת מידעקידום פרמטרים בבנאי (8.0)סיכום – מערכת רישומי תלמידים10מושגי OOP מתקדמים
הרכבה לעומת ירושההזרקת תלויותמחלקות אנונימיותטיפוסי Enum (PHP 8.1)סיבים (PHP 8.1)העמקה בשכפול אובייקטיםמחוללים ואיטרטורים2מרחבי שמות וטעינה אוטומטית
מבוא למרחבי שמותמילת המפתח useתקן הטעינה האוטומטית PSR-4הטוען האוטומטי של Composerסיכום – פרויקט מאורגן5ממשקים וחוזים
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםממשק לעומת מחלקה מופשטתרמזי טיפוסים עם ממשקיםסיכום - מחשבון צורות8מתודות קסם
מבוא למתודות קסם__toString ו־__debugInfo__get, __set, __isset, __unset__call ו־__callStatic__clone ושיבוט אובייקטים__serialize ו־__unserializeסיכום – אוסף מותאם אישית3מאפייני מחלקה
מאפייני מופע לעומת מאפיינים סטטייםקבועים במחלקותמתודות ומאפיינים סטטייםמאפיינים פרטיים ומוגניםמאפיינים לקריאה בלבד (PHP 8.1)סיכום – מנהל חשבון בנק6פולימורפיזם
בחינה מחדש של דריסת מתודותפולימורפיזם באמצעות ממשקיםרמזי טיפוסים וטיפוסי איחודקישור סטטי מאוחרסיכום — מעבד תשלומיםתרגלו בעצמכם: קומפיילר PHP אונליין