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

مراجعة - هيكلية الموظفين

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

challenge icon

التحدي

سهل

لنقم ببناء نظام تسلسل هرمي للموظفين يجمع بين جميع مفاهيم الوراثة التي تعلمتها في هذا الفصل. ستقوم بإنشاء فئة أساسية مجردة (abstract base class) تحدد ما يجب أن يمتلكه كل موظف، ثم تقوم بتوسيعها بأنواع موظفين متخصصين يحسبون المكافآت بشكل مختلف.

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

  • Employee.php — قم بتعريف فئة مجردة Employee تعمل كأساس لجميع أنواع الموظفين. يجب أن تحتوي على خصائص محمية (protected) وهي $name و $salary. يقبل المنشئ (constructor) كلتا القيمتين ويقوم بتعيينهما. قم بتضمين تابع getName() يعيد الاسم، وتابع getSalary() يعيد الراتب، وتابعاً مجرداً calculateBonus() يجب على الفئات التابعة تنفيذه. أضف أيضاً تابع getSummary() يعيد "[name] earns $[salary] with bonus: $[bonus]" حيث [bonus] هو نتيجة استدعاء calculateBonus().
  • Manager.php — قم بتعريف فئة Manager ترث من Employee. قم بتضمين ملف Employee في الأعلى. يتلقى المديرون مكافأة بناءً على نسبة مئوية. أضف خاصية محمية $bonusPercentage. يجب أن يقبل المنشئ الاسم والراتب ونسبة المكافأة — استخدم parent::__construct() لأول قيمتين، ثم قم بتعيين النسبة المئوية بنفسك. قم بتنفيذ calculateBonus() ليعيد الراتب مضروباً في نسبة المكافأة مقسوماً على 100.
  • Developer.php — قم بتعريف فئة Developer ترث من Employee. قم بتضمين ملف Employee في الأعلى. يتلقى المطورون مكافأة ثابتة لإكمال المشروع. أضف خاصية محمية $projectBonus. يجب أن يقبل المنشئ الاسم والراتب ومبلغ مكافأة المشروع — استخدم parent::__construct() لأول قيمتين، ثم قم بتعيين مكافأة المشروع بنفسك. قم بتنفيذ calculateBonus() ليعيد ببساطة مبلغ مكافأة المشروع الثابت.
  • main.php — قم بتضمين ملفي Manager و Developer. ستتلقى خمسة مدخلات: اسم المدير، راتب المدير، نسبة مكافأة المدير، اسم المطور، راتب المطور، ومكافأة مشروع المطور. قم بإنشاء Manager و Developer بهذه القيم. اطبع نتيجة استدعاء getSummary() للمدير أولاً، ثم للمطور، كل منهما في سطر مستقل.

يوضح هذا التحدي كيف تفرض الفئات المجردة عقداً — يجب أن يكون كل موظف قادراً على حساب مكافأته، لكن منطق الحساب يختلف حسب الدور. يستخدم Manager نسبة مئوية من راتبه، بينما يحصل Developer على مبلغ ثابت. يعمل تابع getSummary() المشترك في الفئة الأب بسلاسة مع أي من حسابي المكافأة من خلال تعدد الأشكال (polymorphism).

جرّب بنفسك

<?php
require_once 'Manager.php';
require_once 'Developer.php';

// قراءة المدخلات
$managerName = trim(fgets(STDIN));
$managerSalary = floatval(trim(fgets(STDIN)));
$managerBonusPercentage = floatval(trim(fgets(STDIN)));
$developerName = trim(fgets(STDIN));
$developerSalary = floatval(trim(fgets(STDIN)));
$developerProjectBonus = floatval(trim(fgets(STDIN)));

// TODO: إنشاء كائن Manager باستخدام مدخلات المدير

// TODO: إنشاء كائن Developer باستخدام مدخلات المطور

// TODO: طباعة ملخص المدير (getSummary())

// TODO: طباعة ملخص المطور (getSummary())
?>

جميع دروس Object Oriented Programming