פלטפורמת למידה מקוונת
חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 88 מתוך 91.
אתגר
קלבואו נבנה פלטפורמת למידה מקוונת שמנהלת קורסים, תלמידים ומדריכים. האתגר המקיף הזה משלב ירושה, ממשקים, כימוס ותבניות עיצוב למערכת אחידה.
תארגנו את הקוד בשישה קבצים:
User.php: צרו מחלקה מופשטתUserשתשמש מחלקת בסיס הן לתלמידים והן למדריכים. השתמשו בקידום מאפיינים בבנאי עבורid(int) ו-name(string), שניהם public readonly. כללו מתודה מופשטתgetRole(): stringשמחלקות הבת חייבות לממש.Student.php: כללו את הקובץ User. צרו מחלקהStudentשיורשת מ-User. התלמידים עוקבים אחר הקורסים שאליהם נרשמו במערך פרטי, ואחר ההתקדמות שלהם (אחוז ההשלמה) בכל קורס. ממשו:getRole(): string: מחזירה"Student"enrollInCourse(Course $course): string: רושמת את התלמיד לקורס אם יש בו מקום; מחזירה הודעת הצלחה או כישלוןgetEnrolledCourses(): array: מחזירה את מערך הקורסים שאליהם התלמיד נרשםupdateProgress(string $courseTitle, int $percent): void: מגדירה את ההתקדמות בקורס (0-100)getProgress(string $courseTitle): int: מחזירה את אחוז ההתקדמות, או 0 אם התלמיד לא נרשם לקורס
Instructor.php: כללו את הקובץ User. צרו מחלקהInstructorשיורשת מ-User. מדריכים יכולים ליצור ולנהל קורסים. ממשו:getRole(): string: מחזירה"Instructor"createCourse(string $title, int $capacity): Course: יוצרת ומחזירה Course חדש עם המדריך הזה כמדריך הקורס
Course.php: כללו את הקובץ Instructor. צרו מחלקהCourseעם קידום מאפיינים בבנאי עבורtitle(string, public readonly),instructor(Instructor, public readonly) ו-capacity(int, private). עקבו אחר התלמידים שנרשמו במערך פרטי. ממשו:getCapacity(): int: מחזירה את הקיבולת המרביתgetEnrolledCount(): int: מחזירה את מספר הנרשמים הנוכחיhasCapacity(): bool: מחזירה true אם תלמידים נוספים יכולים להירשםaddStudent(Student $student): bool: מוסיפה תלמיד אם הקיבולת מאפשרת זאת ומחזירה את מצב ההצלחהgetStudents(): array: מחזירה את מערך התלמידים שנרשמו
Platform.php: כללו את הקבצים Course ו-Student. צרו מחלקהPlatformשמנהלת את המערכת כולה. שמרו את הקורסים והמשתמשים במערכים פרטיים. ממשו:addCourse(Course $course): void: מוסיפה קורס לפלטפורמהfindCourse(string $title): ?Course: מוצאת קורס לפי הכותרתenrollStudent(Student $student, string $courseTitle): string: רושמת תלמיד לקורס. החזירו"Course not found","Course is full"או"[name] enrolled in [title]"getCourseStats(string $title): string: מחזירה"[title]: [enrolled]/[capacity] students"או"Course not found"
main.php: כללו את הקובץ Platform. תקבלו שלוש קלטים: נתוני המדריך (JSON), הקורסים שיש ליצור (JSON) והפעולות שיש לבצע (JSON).מבנה ה-JSON של המדריך:
{"id": 1, "name": "Dr. Smith"}מבנה ה-JSON של הקורסים:
[{"title": "PHP Basics", "capacity": 2}, {"title": "OOP Mastery", "capacity": 3}]מבנה ה-JSON של הפעולות:
[{"type": "enroll", "student_id": 1, "student_name": "Alice", "course": "PHP Basics"}, {"type": "progress", "student_id": 1, "course": "PHP Basics", "percent": 50}, {"type": "stats", "course": "PHP Basics"}]צרו את הפלטפורמה, את המדריך ואת כל הקורסים (באמצעות המתודה
createCourseשל המדריך). הוסיפו את הקורסים לפלטפורמה. לאחר מכן עבדו על כל פעולה:"enroll": צרו Student חדש ורשמו אותו לקורס; הדפיסו את התוצאה מ-enrollStudent()"progress": עדכנו את התקדמות התלמיד; הדפיסו"[name] progress in [course]: [percent]%""stats": הדפיסו את התוצאה מ-getCourseStats()
עקבו אחר התלמידים שנוצרו לפי המזהה שלהם, כדי שתוכלו לעדכן את ההתקדמות שלהם בהמשך. הדפיסו את התוצאה של כל פעולה בשורה חדשה.
האתגר הזה מדגים כיצד ירושה יוצרת היררכיית משתמשים מסודרת, כימוס מגן על נתוני ההרשמה, והפלטפורמה משמשת כמתאמת שמנהלת את הקשרים בין קורסים, תלמידים ומדריכים.
נסו בעצמכם
<?php
require_once 'Platform.php';
// קראו את הקלטים
$instructorData = (array)json_decode(trim(fgets(STDIN)), true);
$coursesData = (array)json_decode(trim(fgets(STDIN)), true);
$operations = (array)json_decode(trim(fgets(STDIN)), true);
// TODO: צרו את הפלטפורמה
// TODO: צרו את המדריך מתוך instructorData
// TODO: צרו את כל הקורסים באמצעות המתודה createCourse של המדריך
// והוסיפו אותם לפלטפורמה
// TODO: עקבו אחר הסטודנטים שנוצרו לפי המזהה שלהם
$students = [];
// TODO: עבדו כל פעולה
foreach ($operations as $op) {
$operation = (array)$op;
// TODO: טפלו בפעולה "enroll"
// צרו Student חדש ורשמו אותו לקורס
// הדפיסו את התוצאה של enrollStudent()
// TODO: טפלו בפעולה "progress"
// עדכנו את התקדמות הסטודנט
// הדפס "[name] progress in [course]: [percent]%"
// TODO: טפל בפעולה "stats"
// הדפס את התוצאה של getCourseStats()
}
?>כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין