مراجعة - هيكلية الموظفين
جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 26 من 91.
التحدي
سهلدعونا نبني نظام تسلسل هرمي للموظفين يجمع كل مفاهيم الوراثة التي تعلمتها في هذا الفصل. ستقوم بإنشاء فئة أساسية مجردة (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
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)