2010-04-22 14 views
14

PHP में कक्षा स्तर पर एकाधिक विरासत की अनुमति है?PHP में कक्षा स्तर पर एकाधिक विरासत की अनुमति है?

+0

संभावित डुप्लिकेट में देखो, http: // stackoverflow।कॉम/प्रश्न/90 9 82/एकाधिक-विरासत-इन-पीएचपी –

+0

मेरा मानना ​​है कि स्वीकृत उत्तर यहां बदलना चाहिए, क्योंकि PHP में 'एकाधिक विरासत' के लिए एक समाधान है। जो [इस उत्तर] में वर्णित है (https://stackoverflow.com/a/46905316/2394254) लेकिन स्वीकृत उत्तर में नहीं। – mega6382

उत्तर

32

एकाधिक विरासत Diamond Problem से पीड़ित है, जो अभी तक PHP में हल नहीं हुआ है (इस पर सहमत होने पर सहमत नहीं है)। इस प्रकार, PHP में कोई एकाधिक विरासत नहीं है।

BaseClass 
     /\ 
    /\ 
ClassA ClassB 
     \/
     \/ 
    ClassC 

दोनों ClassA और ClassB अपने तरीके होते foo() है, जो एक आप ClassC में कहेंगे परिभाषित हैं?

आप या तो उपयोग करने के लिए प्रोत्साहित किया जाता है object composition या interfaces (जो एकाधिक वंशानुक्रम की अनुमति देते हैं) या - अगर आप क्षैतिज पुन: उपयोग के बाद कर रहे हैं - जब तक हम Traits (या Grafts या जो कुछ भी वे तो कहा जाएगा है Decorator या Strategy पैटर्न पर गौर)।

कुछ संदर्भ:

+2

ग्रेट विवरण धन्यवाद गॉर्डन !!! –

+2

wooooooo, ग्राफिक्स! +1। –

4

PHP एकाधिक विरासत का समर्थन नहीं करता है।

-3

PHP कक्षाओं के लिए एकाधिक विरासत का समर्थन नहीं करता है।

+3

यह "एकाधिक विरासत का समर्थन नहीं करता है"? तो, इसका मतलब है कि यह करता है, है ना? –

+0

क्या आपने अभी तक इसे सही नहीं किया है? – mega6382

2

नहीं, पीएचपी कक्षाएं केवल एक वर्ग, कई नहीं वारिस कर सकते हैं।

3

आप विधि और संपत्ति प्रतिनिधिमंडल का उपयोग कर इसे नकल कर सकते हैं, लेकिन यह is_a() या instanceof साथ काम नहीं करेंगे:

class A extends B 
{ 
    public function __construct($otherParent) 
    { 
     $this->otherParent = $otherParent; 
    } 

    public function __call($method, $args) 
    { 
     $method = array($this->otherParent, $method); 

     return call_user_func_array($method, $args); 
    } 
} 
+0

पीएलएस विस्तृत मैं इस बिंदु को समझने के बारे में समझ गया ... –

+0

कौन सा बिंदु? Is_a बिंदु है? या प्रतिनिधिमंडल? –

+0

दोनों प्लस eloborate दोनों बिंदु, मैं एक नया कोडर हूँ इन अवधारणाओं से अवगत नहीं –

1

पीएचपी जैसे एकाधिक वंशानुक्रम का समर्थन नहीं करता है, लेकिन यह के सेट का पुन: उपयोग करने के लिए कुछ आराम प्रदान करता है traits का उपयोग करके कई स्वतंत्र कक्षाओं में विधियां। एक trait सिर्फ एक वर्ग की तरह लिखा गया है, लेकिन इसे स्वयं द्वारा तत्काल नहीं किया जा सकता है।

पूर्वता आदेश उदाहरण::

नीचे

पीएचपी मैनुअल से उदाहरण के एक जोड़े हैं

class Base { 
    public function sayHello() { 
     echo 'Hello '; 
    } 
} 

trait SayWorld { 
    public function sayHello() { 
     parent::sayHello(); 
     echo 'World!'; 
    } 
} 

class MyHelloWorld extends Base { 
    use SayWorld; 
} 

$o = new MyHelloWorld(); 
$o->sayHello(); 

आउटपुट:

trait A { 
    public function smallTalk() { 
     echo 'a'; 
    } 
    public function bigTalk() { 
     echo 'A'; 
    } 
} 

trait B { 
    public function smallTalk() { 
     echo 'b'; 
    } 
    public function bigTalk() { 
     echo 'B'; 
    } 
} 

class Talker { 
    use A, B { 
     B::smallTalk insteadof A; 
     A::bigTalk insteadof B; 
    } 
} 

class Aliased_Talker { 
    use A, B { 
     B::smallTalk insteadof A; 
     A::bigTalk insteadof B; 
     B::bigTalk as talk; 
    } 
} 
:

Hello World! 

यहाँ संघर्ष समाधान के साथ एक और उदाहरण है

अधिक जानकारी और की गहरी समझ के लिए PHP में एकाधिक विरासत।

Horizontal Reuse for PHP

संबंधित मुद्दे