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

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

جزء من قسم البرمجة كائنية التوجه في رحلة PHP على Coddy. الدرس 88 من 91.

challenge icon

التحدي

سهل

لنبنِ منصة تعلّم إلكتروني تدير الدورات والطلاب والمدرّسين. يجمع هذا التحدّي الشامل بين الوراثة والواجهات والتغليف وأنماط التصميم في نظام متماسك.

ستنظّم شيفرتك عبر ستة ملفات:

  • User.php: Create فئة User abstract تعمل كقاعدة لكلٍّ من الطلاب والمدرّسين. استخدم ترقية المُنشئ لكلٍّ من id (int) وname (string)، وكلاهما public readonly. أدرج دالة abstract باسم getRole(): string يجب على الفئات الابنة تنفيذها.
  • Student.php: أدرج ملف User. Create فئة Student extending User. يتتبّع الطلاب دوراتهم المسجَّلين فيها في array private، كما يتتبّعون تقدّمهم (النسبة المئوية المكتملة) لكل دورة. نفّذ:
    • getRole(): string: تُرجع "Student"
    • enrollInCourse(Course $course): string: تُسجّل الطالب إذا كانت للدورة سعة؛ وتُرجع رسالة نجاح أو failure
    • getEnrolledCourses(): array: تُرجع array الدورات المسجَّل فيها
    • updateProgress(string $courseTitle, int $percent): void: تضبط التقدّم لدورة (من 0 إلى 100)
    • getProgress(string $courseTitle): int: تُرجع نسبة التقدّم، أو 0 إذا لم يكن مسجَّلًا
  • Instructor.php: أدرج ملف User. Create فئة Instructor extending User. يمكن للمدرّسين Create الدورات وإدارتها. نفّذ:
    • getRole(): string: تُرجع "Instructor"
    • createCourse(string $title, int $capacity): Course: تنشئ وتُرجع Course جديدة مع تعيين هذا المدرّس لها
  • Course.php: أدرج ملف Instructor. Create فئة Course مع ترقية المُنشئ لكلٍّ من title (string, public readonly)، وinstructor (Instructor, public readonly)، وcapacity (int, private). تتبّع الطلاب المسجَّلين في array private. نفّذ:
    • getCapacity(): int: تُرجع السعة القصوى
    • getEnrolledCount(): int: تُرجع العدد الحالي للمسجَّلين
    • hasCapacity(): bool: تُرجع true إذا كان بإمكان مزيد من الطلاب التسجيل
    • addStudent(Student $student): bool: تضيف الطالب إذا سمحت السعة، وتُرجع حالة النجاح
    • getStudents(): array: تُرجع array الطلاب المسجَّلين
  • Platform.php: أدرج ملفَي Course وStudent. Create فئة Platform تدير النظام entire. خزّن الدورات والمستخدمين في arrays private. نفّذ:
    • 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)، والدورات المطلوب Createها (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"}]

    Create المنصة والمدرّس وجميع الدورات (باستخدام أسلوب المدرّس createCourse). أضف الدورات إلى المنصة. ثم عالج كل عملية:

    • "enroll": Create طالبًا جديدًا وتسجيله؛ اطبع النتيجة من enrollStudent()
    • "progress": حدّث تقدّم الطالب؛ اطبع "[name] progress in [course]: [percent]%"
    • "stats": اطبع النتيجة من getCourseStats()

    احتفظ بسجل للطلاب created بحسب معرّف كلٍّ منهم حتى تتمكّن من تحديث تقدّمهم لاحقًا. اطبع نتيجة كل عملية في سطر جديد.

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

جرّب بنفسك

<?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"
    // أنشئ Student جديدًا وسجّله
    // اطبع النتيجة من enrollStudent()
    
    // TODO: تعامل مع عملية "progress"
    // حدّث تقدم الطالب
    // اطبع "[name] progress in [course]: [percent]%"
    
    // TODO: تعامل مع عملية "stats"
    // اطبع النتيجة من getCourseStats()
}

?>

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم PHP عبر الإنترنت