Menu
Coddy logo textTech

טיפוסי 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

טיפוסים בני-מנייה יכולים להכיל גם מתודות, מה שהופך אותם לכלי רב-עוצמה לאיגוד של לוגיקה קשורה. הם עובדים בצורה חלקה עם רמזי טיפוסים, ומבטיחים שהפונקציות שלך יקבלו רק ערכים תקינים — אין עוד צורך לבדוק אם מחרוזת תואמת לאפשרויות הצפויות.

challenge icon

אתגר

קל

בואו נבנה מערכת לניהול הזמנות שמשתמשת במנויים כדי לייצג את סטטוסי ההזמנות באופן בטוח מבחינת טיפוסים. במקום להסתמך על מחרוזות שעלולות להכיל שגיאות כתיב או להיות לא תקינות, תיצרו מנוי מגובה שממפה כל סטטוס לערך ידידותי למסד נתונים.

תארגנו את הקוד שלכם בשלושה קבצים:

  • 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"

?>
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר PHP אונליין