الكلمة المفتاحية parent::
جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 22 من 91.
عندما يرث صنف ابن (child class) من صنف أب (parent class)، قد تحتاج أحياناً إلى الوصول إلى دوال أو خصائص الصنف الأب مباشرةً. تتيح لك الكلمة المفتاحية parent:: استدعاء تنفيذ الصنف الأب من داخل الصنف الابن.
هذا مفيد بشكل خاص في الدوال الإنشائية (constructors) عندما يحتاج الصنف الابن إلى تهيئة خصائص الصنف الأب مع إعداد خصائصه الخاصة في نفس الوقت:
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
class Dog extends Animal {
public $breed;
public function __construct($name, $breed) {
parent::__construct($name);
$this->breed = $breed;
}
public function describe() {
return "$this->name is a $this->breed";
}
}
$dog = new Dog("Max", "Labrador");
echo $dog->describe();
المخرجات:
Max is a Labradorمن خلال استدعاء parent::__construct($name)، تعيد الفئة الفرعية استخدام منطق التهيئة الخاص بالفئة الأب بدلاً من تكراره. وبدون هذا الاستدعاء، لن يتم تعيين الخاصية $name أبداً.
يمكنك استخدام parent:: لاستدعاء أي طريقة (method) تابعة للفئة الأب، وليس فقط المنشئات (constructors). يصبح هذا الأمر مهماً بشكل خاص عندما ترغب في توسيع سلوك طريقة معينة بدلاً من استبدالها بالكامل.
نقطة رئيسية: توفر الكلمة المفتاحية parent:: طريقة للوصول إلى تنفيذ الفئة الأب (parent class). وهي ضرورية لربط المنشئات (constructor chaining) بشكل صحيح وللبناء على الوظائف الموروثة بدلاً من إعادة كتابتها.
التحدي
سهلدعونا نبني نظام كتالوج منتجات يوضح كيف يمكن للفئات التابعة (child classes) توسيع وظائف الفئة الأب (parent class) باستخدام الكلمة المفتاحية parent:: لربط المنشئات (constructors) بشكل صحيح والبناء على الأساليب (methods) الموروثة.
ستقوم بتنظيم الكود الخاص بك عبر ثلاثة ملفات:
Product.php— قم بتعريف فئةProductالتي تعمل كقاعدة لجميع المنتجات. يجب أن تحتوي على خصائص عامة (public properties) وهي$nameو$price. يقبل المنشئ (constructor) الاسم والسعر، ويقوم بتعيين كلتا الخاصيتين. قم بتضمين أسلوبgetDetails()الذي يعيد"[name]: $[price]".ElectronicProduct.php— قم بتعريف فئةElectronicProductالتي ترث منProduct. قم بتضمين ملف Product في الأعلى. تضيف هذه الفئة خاصية$warranty(بالأشهر). يجب أن يقبل المنشئ الاسم، والسعر، والضمان — استخدمparent::__construct()لتهيئة الاسم والسعر من خلال الفئة الأب، ثم قم بتعيين الضمان بنفسك. أنشئ أسلوبgetDetails()يبني على تنفيذ الفئة الأب: استدعِparent::getDetails()وأضف" (Warranty: [warranty] months)"إليه.main.php— قم بتضمين ملف ElectronicProduct. ستتلقى ثلاثة مدخلات: اسم المنتج، والسعر (كسلسلة نصية لتحويلها إلى رقم عشري float)، وفترة الضمان (كسلسلة نصية لتحويلها إلى عدد صحيح integer). أنشئ كائنElectronicProductبهذه القيم واطبع نتيجة استدعاءgetDetails().
يوضح هذا التحدي القوة الحقيقية لـ parent:: — ليس فقط لربط المنشئات، ولكن أيضاً لتوسيع سلوك الأساليب. تعيد فئة ElectronicProduct استخدام منطق التنسيق الخاص بالفئة الأب وتضيف تفاصيلها الخاصة فوقه، مما يتجنب تكرار الكود مع إنشاء مخرجات أكثر ثراءً.
ورقة مرجعية
تسمح الكلمة المفتاحية parent:: للفئة الابنة بالوصول إلى الدوال والخصائص من الفئة الأب الخاصة بها.
استخدم parent::__construct() لاستدعاء منشئ (constructor) الفئة الأب من الفئة الابنة:
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
class Dog extends Animal {
public $breed;
public function __construct($name, $breed) {
parent::__construct($name);
$this->breed = $breed;
}
}
يمكنك أيضاً استخدام parent:: لاستدعاء أي دالة في الفئة الأب وتوسيع سلوكها:
<?php
class Animal {
public function describe() {
return "This is an animal";
}
}
class Dog extends Animal {
public function describe() {
return parent::describe() . " and it's a dog";
}
}
يتيح هذا النهج للفئات الابنة إعادة استخدام منطق الفئة الأب بدلاً من تكرار الكود، مما يُمكّن من تسلسل المنشئ (constructor chaining) وتوسيع الدوال بشكل صحيح.
جرّب بنفسك
<?php
require_once 'ElectronicProduct.php';
// قراءة المدخلات
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$warranty = intval(trim(fgets(STDIN)));
// TODO: إنشاء ElectronicProduct بالقيم المدخلة
// وطباعة نتيجة استدعاء getDetails()
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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)