الأصناف المجردة (Abstract Classes)
جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 25 من 91.
الفئة المجردة (abstract class) هي فئة لا يمكن إنشاء مثيل لها مباشرة. فهي تعمل بمثابة مخطط للفئات الأخرى، حيث تحدد الأساليب (methods) التي يجب على الفئات التابعة (child classes) تنفيذها. يمكنك إنشاء فئة مجردة باستخدام الكلمة المفتاحية abstract.
<?php
abstract class Shape {
protected $color;
public function __construct($color) {
$this->color = $color;
}
abstract public function calculateArea();
public function getColor() {
return $this->color;
}
}
class Rectangle extends Shape {
private $width;
private $height;
public function __construct($color, $width, $height) {
parent::__construct($color);
$this->width = $width;
$this->height = $height;
}
public function calculateArea() {
return $this->width * $this->height;
}
}
$rect = new Rectangle("blue", 5, 3);
echo $rect->calculateArea();
المخرجات:
15تعلن الفئة Shape عن طريقة مجردة calculateArea() دون تقديم تنفيذ لها. يجب على أي فئة ترث من Shape تنفيذ هذه الطريقة. لاحظ أن الفئات المجردة يمكن أن تحتوي أيضاً على طرق عادية مثل getColor() ترثها الفئات الفرعية مباشرة.
تحدد الدوال المجردة (Abstract methods) ما يجب على الفئة الفرعية القيام به، ولكن ليس الكيفية. يضمن هذا أن جميع الأشكال لديها دالة calculateArea() مع السماح لكل شكل بحساب مساحته بشكل مختلف.
نقطة رئيسية: تجمع الأصناف المجردة (Abstract classes) بين هيكل الوراثة والمتطلبات الإلزامية. استخدمها عندما ترغب في مشاركة الكود بين الأصناف ذات الصلة مع ضمان قيام كل صنف تابع (child class) بتنفيذ دوال (methods) معينة.
التحدي
سهللنقم ببناء نظام مشغل وسائط يوضح كيف تفرض الفئات المجردة (abstract classes) عقداً مع السماح لأنواع الوسائط المختلفة بتنفيذ سلوك التشغيل الخاص بها.
ستقوم بتنظيم الكود الخاص بك عبر ثلاثة ملفات:
Media.php— قم بتعريف فئة مجردة باسمMediaتعمل كمخطط لجميع أنواع الوسائط. يجب أن تحتوي على خاصية محمية (protected) باسم$titleومنشئ (constructor) يقبل العنوان ويقوم بتعيينه. قم بتضمين طريقة مجردة (abstract method) تسمىplay()يجب على الفئات التابعة تنفيذها. أضف أيضاً طريقة عاديةgetTitle()تعيد العنوان — سيتم توريث هذه الطريقة الملموسة (concrete method) من قبل جميع الفئات التابعة.Song.php— قم بتعريف فئةSongترث منMedia. قم بتضمين ملف Media في الأعلى. تضيف هذه الفئة خاصية$artist. يجب أن يقبل المنشئ العنوان والفنان — استخدمparent::__construct()للعنوان، ثم قم بتعيين الفنان بنفسك. قم بتنفيذ طريقةplay()المطلوبة لتعيد"Playing song: [title] by [artist]".Podcast.php— قم بتعريف فئةPodcastترث منMedia. قم بتضمين ملف Media في الأعلى. تضيف هذه الفئة خاصية$episode(عدد صحيح). يجب أن يقبل المنشئ العنوان ورقم الحلقة — استخدمparent::__construct()للعنوان، ثم قم بتعيين الحلقة. قم بتنفيذ طريقةplay()المطلوبة لتعيد"Playing podcast: [title] - Episode [episode]".
في ملف main.php، قم بتضمين ملفي Song و Podcast. ستتلقى أربعة مدخلات: عنوان الأغنية، اسم الفنان، عنوان البودكاست، ورقم الحلقة (كسلسلة نصية لتحويلها إلى عدد صحيح). قم بإنشاء كائن Song وكائن Podcast بهذه القيم. اطبع نتيجة استدعاء play() على الأغنية أولاً، ثم على البودكاست، كل منهما في سطر مستقل.
يوضح هذا التحدي كيف تحدد الفئات المجردة عقداً — يجب أن يحتوي كل نوع من أنواع الوسائط على طريقة play()، ولكن كل نوع ينفذها بشكل مختلف. لا يمكن إنشاء كائن من الفئة المجردة Media مباشرة؛ فهي موجودة فقط لتوفير الهيكل والوظائف المشتركة لأبنائها.
ورقة مرجعية
الفئة المجردة (abstract class) هي فئة لا يمكن إنشاء كائن منها مباشرة. وهي تعمل كمخطط للفئات الأخرى، حيث تحدد الطرق (methods) التي يجب على الفئات التابعة تنفيذها. استخدم الكلمة المفتاحية abstract لإنشاء فئة مجردة.
abstract class Shape {
protected $color;
public function __construct($color) {
$this->color = $color;
}
abstract public function calculateArea();
public function getColor() {
return $this->color;
}
}يجب على الفئات التابعة تنفيذ جميع الطرق المجردة (abstract methods):
class Rectangle extends Shape {
private $width;
private $height;
public function __construct($color, $width, $height) {
parent::__construct($color);
$this->width = $width;
$this->height = $height;
}
public function calculateArea() {
return $this->width * $this->height;
}
}الخصائص الرئيسية:
- لا يمكن إنشاء كائنات من الفئات المجردة مباشرة
- الطرق المجردة ليس لها تنفيذ في الفئة المجردة
- يجب على الفئات التابعة تنفيذ جميع الطرق المجردة
- يمكن أن تحتوي الفئات المجردة على طرق مجردة وطرق عادية
- يتم توريث الطرق العادية في الفئات المجردة من قبل الفئات التابعة
جرّب بنفسك
<?php
require_once 'Song.php';
require_once 'Podcast.php';
// قراءة المدخلات
$songTitle = trim(fgets(STDIN));
$artistName = trim(fgets(STDIN));
$podcastTitle = trim(fgets(STDIN));
$episodeNumber = intval(trim(fgets(STDIN)));
// TODO: إنشاء كائن Song باستخدام songTitle و artistName
// TODO: إنشاء كائن Podcast باستخدام podcastTitle و episodeNumber
// TODO: طباعة نتيجة استدعاء play() على الأغنية (song)
// TODO: طباعة نتيجة استدعاء play() على البودكاست (podcast)
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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)