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

هل يمكن الوراثة من أكثر من صنف واحد في PHP؟

Emad Saif

السؤال

بفرض أن لدي ثلاثة أصناف على النحو التالي:

class A {
	// ...
}

class B {
	// ...
}

class C {
	// ...
}

هل يمكن عمل صنف جديد يقوم بوراثة كل التوابع الموجودة في هذه الأصناف معًا في PHP؟ أي عمل extends للأصناف A, B, C معًا لصنف جديد.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

لا تبدوا فكرة وراثة أكثر من صنف منطقية بالنسبة للبرمجة كائنية التوجه. هل يمكن معرفة الغرض الأول من ذلك؟ ربما ستفضل استعمال السمات لاستخدام توابع متعددة من سمات متعددة. لاحظ المثال:

trait A {
    public function method_from_a($s) {
        echo $s;
    }
}

trait B {
    public function method_from_b($s) {
        echo $s;
    }
}
trait C {
    public function method_from_c($s) {
        echo $s;
    }
}

class D {
    use A,B,C;
}

$d = new D;

$d->method_from_a('from a');
$d->method_from_b('from b');
$d->method_from_c('from c');

بجانب ان الأمر غير مقيد، سيمكنك استعمال مالانهاية من السمات.

ان كان الأمر مقيد بثلاث أصناف بالضبط فسيمكنك كفكرة تزييف هاته العملية عن طريق وراثة صنف A من صنف B ثم الاستعانة بالتابع السحري call_ لإستدعاء تابع ما ضمن صنف ثالث C. يكون ذلك بشكل مشابه: 

class B {
    public function called_from_b($str) {
        echo $str;
    }
}

class C {
    public function called_from_c($str) {
        echo $str;
    }
}

class A extends B
{
  private $c;
    
  public function __construct()
  {
    $this->c = new C;
  }
    
  
  public function __call($method, $args)
  {
    $this->c->$method($args[0]);
  }
}


$a = new A;
$a->called_from_b("abc");
$a->called_from_c("def");

حيث أن: 

  • A يرث B
  • A يمتلك خاصية c هي كائن عن النموذج C 
  • في حالة استدعاء تابع غير موجود لا في B ولا في A سيتم الاستعانة بالتابع السحري call_ لارساله من C
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

أغلب اللغات البرمجية الحديثة لا تدعم مفهوم الوراثة المتعددة, ولكن يوجد بدائل لهذا المفهوم , من ضمنهم كما إقترح أستاذ  عدنان إستخدام الtraits , كما أيضًا يوجد مبدأ هام في البرمجة كائنية التوجه  وهو prefer composition over inheritance أي " إستخدم التركيب بدلًا من الوراثة"

ولكن ما المقصود بذلك؟ يمكننا معرفة المقصود عبر المثال التالي :

<?php
class Vehicle
{    
    public function move()
    {
        echo "emad's car started moving";
    }    
}

class Car extends Vehicle
{
    public function accelarate()
    {    
        move();    
    }
}

$car = new Car();
$car->accelarate(); 

في المثال السابق قمنا بإستخدام الوراثة, ولكن ماذا لو أردنا أن نرث من صنف أخر ما الحل؟ أو ماذا إن كنا لا نحتاج جميع الدوال والوظائف التي يقدمها الصنف الأب , في هذا الوقت الوراثة ليس شئ منطقي لذا المنطقي أ، نقوم بإستخدام التركيب أو بالإنجليزية Composition وهو عبارة عن وضع كائن من الصنف الأب بداخل الصنف الإبن لذا يتمكن الصنف الإبن من إستخدام وظائف الصنف الأب دون الوراثة منه كما يظهر لدينا بعد تعديل المثال السابق  

<?php
class Vehicle
{    
    public function move()
    {
        echo "emad's car started moving";
    }    
}

class Car
{
    private $vehicle;

    public function __construct(Vehicle $vehicle)
    {
        $this->vehicle = $vehicle;
    }

    public function accelarate()
    {    
        $this->vehicle->move();    
    }
}

$vehicle = new Vehicle();
$car = new Car($vehicle);
$car->accelarate();

كما يتضح لنا تمكنا الأن من إستخدام وظائف الصنف vehicle دون وراثتها وذلك عبر إنشاء كائن من ذلك الصنف في الصنف Car , وهذا ما يُسمى بالcomposition ويمكننا تطبيق ذلك المبدأ في حالتك عبر وضع كائنات من الأصناف الثلاثة بداخل الصنف الجديد كما يتضح لنا في الشفرة البرمجية التالية 

class A {
	// ...
}

class B {
	// ...
}

class C {
	// ...
}

class child{
	$a;
	$b;
	$c;
	public function __construct(A $a, B $b, C $c)
    {
        $this->a = $a;
		$this->b = $b;
		$this->c = $c;
    }
///////يمكنك هنا وضع الوظائف التي تحتاجها وتقوم بإستدعاؤها من الأصناف التي قمنا بعمل تركيب لها


}

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...