اذهب إلى المحتوى

السؤال

نشر

لدي ثلاثة أصناف Classes وكلُ منهم يحتوي على تابع باني constructor على النحو التالي:

class GrandFather
{
    public function __construct()
    {
		// ..
    }
}

class Father extends GrandFather
{
    public function __construct()
    {
        // call GrandFather's constructor
        parent::__construct();
    }
}

class Son extends Father
{
    public function __construct()
    {
        // أريد إستدعاء التابع الباني الخاص بالصنف GrandFather هنا
        // بدون تشغيل التابع الباني الخاص بالصنف Father
    }
}

أريد إستدعاء التابع الباني الخاص بالصنف GrandFather من داخل الصنف Son، ولكن بدون تشغيل التابع الباني الخاص بالصنف Father

هل هناك طريقة للقيام بهذا الأمر؟

Recommended Posts

  • 1
نشر

يمكنك تحديد الصنف الذي تريد استدعاء التابع الباني له من داخل أحد أصنافه الفرعية عبر ذكر اسم الصنف واستدعاء التابع construct__ كما لو كنا نستدعي تابعًا ثابتًا كالتالي:

class Son extends Father
{
    public function __construct()
    {
        GrandFather::__construct();
    }
}

فقط في حالة كنت تريد استدعاء التابع الباني للأب مباشرة (وهو أشيع أستخدام) أي Father يمكنك استخدام الكلمة parent كالتالي:

class Son extends Father
{
    public function __construct()
    {
        parent::__construct(); // استدعاء التابع الباني للأب المباشر
    }
}

احتياجك لهذه الطريقة أي تجاوزك للتابع الباني للأب قد يشير إلى وجود مشكلة في التصميم، في حال كانت الأصناف ملكك ويمكنك إعادة تصميمها فكر في ذلك، يمكنك الاستفادة من قراءة المقال التالي للتعرف على الإمكانات المتوفرة في لغة PHP التي تخص الوراثة وتهدد الأشكال Polymorphism لمحاولة إيجاد تصميم بديل للتصميم الحالي:

 

  • 1
نشر

يمكنك كذلك إستخدام الدالة get_parent_class، حيث تمكنك الدالة get_parent_class من معرفة الصنف الأب لأي صنف آخر (بما في ذلك الصنف الحالي عبر this$)، ومع إستخدام الصنف ReflectionMethod يمكنك تنفيذ التابع الباني constructor على النحو التالي:

<?php

class GrandFather
{
    public function __construct()
    {
		echo "GrandFather's constructor \n";
    }
}

class Father extends GrandFather
{
    public function __construct()
    {
        // call GrandFather's constructor
        parent::__construct();
    }
}

class Son extends Father
{
    public function __construct()
    {
    	$grandpa = get_parent_class(get_parent_class($this));
        $reflectionMethod = new ReflectionMethod($grandpa, '__construct');
        
        // calling grandFather constructor
        $reflectionMethod->invoke($this);
        
        echo "calling the constructor from " . $grandpa . " Class";
    }
}

$son = new Son();

/*
Output:

GrandFather's constructor 
calling the constructor from GrandFather Class

*/

توثيق الدالة get_parent_class في موسوعة حسوب.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...