Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

منصة التعليم الإلكتروني

جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 88 من 91.

challenge icon

التحدي

سهل

لنقم ببناء منصة تعليم إلكتروني (E-Learning Platform) تدير الدورات التدريبية، والطلاب، والمحاضرين. يجمع هذا التحدي الشامل بين الوراثة (inheritance)، والواجهات (interfaces)، والكبسلة (encapsulation)، وأنماط التصميم في نظام متماسك.

ستقوم بتنظيم الكود الخاص بك عبر ستة ملفات:

  • User.php — أنشئ فئة مجردة (abstract class) باسم User تعمل كقاعدة لكل من الطلاب والمحاضرين. استخدم خاصية constructor promotion لكل من id (int) و name (string)، وكلاهما public readonly. قم بتضمين تابع مجرد (abstract method) باسم getRole(): string يجب على الفئات التابعة تنفيذه.
  • Student.php — قم بتضمين ملف User. أنشئ فئة Student ترث من User. يتتبع الطلاب دوراتهم المسجلة في مصفوفة خاصة (private array) وتقدمهم (نسبة مئوية مكتملة) لكل دورة. قم بتنفيذ ما يلي:
    • 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 مع استخدام constructor promotion لـ 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" — أنشئ طالباً جديداً وقم بتسجيله؛ واطبع النتيجة من enrollStudent()
    • "progress" — حدث تقدم الطالب؛ واطبع "[name] progress in [course]: [percent]%"
    • "stats" — اطبع النتيجة من getCourseStats()

    تتبع الطلاب الذين تم إنشاؤهم بواسطة معرفاتهم (ID) حتى تتمكن من تحديث تقدمهم لاحقاً. اطبع نتيجة كل عملية في سطر جديد.

يوضح هذا التحدي كيف تخلق الوراثة تسلسلاً هرمياً نظيفاً للمستخدمين، وكيف تحمي الكبسلة بيانات التسجيل، وكيف تعمل المنصة كمنسق يدير العلاقات بين الدورات والطلاب والمحاضرين.

جرّب بنفسك

<?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: تتبع الطلاب الذين تم إنشاؤهم من خلال معرفاتهم (ID)
$students = [];

// TODO: معالجة كل عملية
foreach ($operations as $op) {
    $operation = (array)$op;
    
    // TODO: معالجة عملية "enroll"
    // إنشاء طالب جديد وتسجيله
    // طباعة النتيجة من enrollStudent()
    
    // TODO: معالجة عملية "progress"
    // تحديث تقدم الطالب
    // طباعة "[name] progress in [course]: [percent]%"
    
    // TODO: معالجة عملية "stats"
    // طباعة النتيجة من getCourseStats()
}

?>

جميع دروس Object Oriented Programming