منصة التعليم الإلكتروني
جزء من قسم البرمجة كائنية التوجه في رحلة PHP على Coddy. الدرس 88 من 91.
التحدي
سهللنبنِ منصة تعلّم إلكتروني تدير الدورات والطلاب والمدرّسين. يجمع هذا التحدّي الشامل بين الوراثة والواجهات والتغليف وأنماط التصميم في نظام متماسك.
ستنظّم شيفرتك عبر ستة ملفات:
User.php: Create فئةUserabstract تعمل كقاعدة لكلٍّ من الطلاب والمدرّسين. استخدم ترقية المُنشئ لكلٍّ منid(int) وname(string)، وكلاهما public readonly. أدرج دالة abstract باسمgetRole(): stringيجب على الفئات الابنة تنفيذها.Student.php: أدرج ملف User. Create فئةStudentextendingUser. يتتبّع الطلاب دوراتهم المسجَّلين فيها في array private، كما يتتبّعون تقدّمهم (النسبة المئوية المكتملة) لكل دورة. نفّذ:getRole(): string: تُرجع"Student"enrollInCourse(Course $course): string: تُسجّل الطالب إذا كانت للدورة سعة؛ وتُرجع رسالة نجاح أو failuregetEnrolledCourses(): array: تُرجع array الدورات المسجَّل فيهاupdateProgress(string $courseTitle, int $percent): void: تضبط التقدّم لدورة (من 0 إلى 100)getProgress(string $courseTitle): int: تُرجع نسبة التقدّم، أو 0 إذا لم يكن مسجَّلًا
Instructor.php: أدرج ملف User. Create فئةInstructorextendingUser. يمكن للمدرّسين 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()
}
?>جميع دروس البرمجة كائنية التوجه
1أساسيات OOP
الملفات الخارجيةمقدمة في OOPClasses مقابل Objectsالكلمة المفتاحية $thisالـ Methodsالـ Propertiesالمنشئ (__construct)الهادم (__destruct)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسيةالكلمة المفتاحية parent::إعادة تعريف الدوال (Method Overriding)الكلمة المفتاحية finalالأصناف المجردة (Abstract Classes)مراجعة - هيكلية الموظفين7التغليف (Encapsulation)
العام، المحمي، الخاص (Public, Protected, Private)نظرة متعمقة على معدلات الوصولدوال Getters و Settersإخفاء المعلوماتميزة Constructor Promotion (8.0)مراجعة - نظام سجلات الطلاب10مفاهيم البرمجة كائنية التوجه المتقدمة
التركيب مقابل الوراثةحقن التبعيةالأصناف المجهولةالتعدادات (PHP 8.1)الألياف (PHP 8.1)تعمق في استنساخ الكائناتالمولدات والمكررات13أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المستودع2مساحات الأسماء والتحميل التلقائي
مقدمة إلى مساحات الأسماءالكلمة المفتاحية useمعيار التحميل التلقائي PSR-4أداة التحميل التلقائي Composerملخص - مشروع منظم5الواجهات والعقود
مقدمة إلى الواجهاتتنفيذ الواجهاتتنفيذ واجهات متعددةالواجهة مقابل الـ Abstract Classالـ Type Hinting مع الواجهاتملخص - حاسبة الأشكال8الميثودات السحرية (Magic Methods)
مقدمة في الميثودات السحرية__toString و __debugInfo__get, __set, __isset, __unset__call و __callStatic__clone واستنساخ الكائنات__serialize و __unserializeمراجعة - Custom Collection3خصائص الكلاس
خصائص الـ Instance مقابل الخصائص الساكنة (Static)الثوابت في الكلاساتالدوال والخصائص الساكنة (Static)الخصائص الخاصة (Private) والمحمية (Protected)خصائص للقراءة فقط (Readonly) في PHP 8.1مراجعة - مدير الحساب البنكي6تعدد الأشكال (Polymorphism)
مراجعة إعادة تعريف الدوال (Method Overriding)تعدد الأشكال عبر الـ Interfacesتلميح النوع (Type Hinting) وأنواع الاتحاد (Union Types)الربط الاستاتيكي المتأخر (Late Static Binding)ملخص - معالج الدفع (Payment Processor)تدرّب بنفسك: مترجم PHP عبر الإنترنت