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

الكلمة المفتاحية 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) بشكل صحيح وللبناء على الوظائف الموروثة بدلاً من إعادة كتابتها.

challenge icon

التحدي

سهل

دعونا نبني نظام كتالوج منتجات يوضح كيف يمكن للفئات التابعة (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()

?>
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming