Menu
Coddy logo textTech

מחלקות אנונימיות

חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 58 מתוך 91.

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

מחלקה אנונימית מוגדרת באמצעות new class ולאחריה גוף המחלקה:

<?php
$logger = new class {
    public function log(string $message): void {
        echo "Log: $message";
    }
};

$logger->log("Hello!");

פלט:

Log: Hello!

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

<?php
interface Notifier {
    public function send(string $message): string;
}

function notify(Notifier $notifier, string $msg): string {
    return $notifier->send($msg);
}

$result = notify(new class implements Notifier {
    public function send(string $message): string {
        return "Sent: $message";
    }
}, "Test message");

echo $result;

פלט:

Sent: Test message

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

challenge icon

אתגר

קל

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

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

  • FormatterInterface.php: הגדירו ממשק בשם FormatterInterface עם מתודה אחת, format(string $data): string. כך תגדירו את החוזה שעל כל מעצב נתונים לקיים.
  • main.php: כללו את קובץ הממשק וצרו מחלקת DataProcessor שמשתמשת בהזרקת תלות כדי לקבל כל מעצב נתונים. המחלקה צריכה:
    • לקבל FormatterInterface בבנאי שלה
    • להכיל מתודה process(string $data) שמעבירה את הנתונים למעצב הנתונים שהוזרק ומחזירה את התוצאה שלו

    תקבלו שתי קלטים: סוג עיצוב ("upper" או "reverse") ומחרוזת לעיצוב.

    בהתאם לסוג העיצוב, צרו מחלקה אנונימית שמממשת את FormatterInterface:

    • עבור "upper": המתודה format() צריכה להחזיר את הנתונים כשהם מומרות לאותיות רישיות
    • עבור "reverse": המתודה format() צריכה להחזיר את הנתונים בסדר הפוך

    הזריקו את המחלקה האנונימית שלכם ל־DataProcessor, קראו ל־process() עם מחרוזת הקלט והדפיסו את התוצאה.

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

נסו בעצמכם

<?php
require_once 'FormatterInterface.php';

// TODO: צור מחלקת DataProcessor ש:
// - מקבלת FormatterInterface בבנאי שלה
// - כוללת מתודה process(string $data) שמעבירה את הטיפול למעצב

// קרא קלט
$formatType = trim(fgets(STDIN));
$inputString = trim(fgets(STDIN));

// TODO: על סמך $formatType ("upper" או "reverse"), צור מחלקה אנונימית
// שמממשת את FormatterInterface
// - עבור "upper": על format() להחזיר את הנתונים באותיות רישיות
// - עבור "reverse": על format() להחזיר את הנתונים בסדר הפוך

// TODO: צור DataProcessor עם מעצב המחלקה האנונימית שלך
// קרא ל-process() עם מחרוזת הקלט והדפס את התוצאה

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

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

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

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