2011-07-03 6 views
7

संभव डुप्लिकेट:
Can I extend a class using more than 1 class in PHP?क्या आप एक कक्षा में दो कक्षाएं बढ़ा सकते हैं?

मैं एक वर्ग कई बच्चे कक्षाओं है, हालांकि मैं अब एक और वर्ग है जो मैं भी माता-पिता की संतान होने के लिए चाहते द्वारा जोड़ा जा रहा है, हालांकि मैं अन्य बच्चों के वर्गों में से कई कार्यों का भी उपयोग करना चाहूंगा।

मैं सिर्फ माता-पिता के लिए दूसरे बच्चे कक्षा से संबंधित कार्यों हिलाने की सोचा है, फिर भी नहीं सोचा था कि यह वास्तव में जरूरत थी, क्योंकि यह केवल इन दो बच्चे कक्षाओं कि इनका प्रयोग तो उम्मीद थी कि हो सकता है मैं मुख्य अभिभावक वर्ग और मौजूदा बाल वर्गों में से एक से विस्तार कर सकता हूं।

उत्तर

9

आप दोनों अपने माता पिता और बच्चे के काम करता है, जो मुझे लगता है कि आप क्या करने की कोशिश कर रहे हैं क्या है वारिस के बच्चे कक्षा विस्तार कर सकते हैं।

class Parent 
{ 
    protected function _doStuff(); 
} 

class Child extends Parent 
{ 
    protected function _doChildStuff(); 
} 

class Your_Class extends Child 
{ 
    // Access to all of Parent and all of Child's members 
} 

// Your_Class has access to both _doStuff() and _doChildStuff() by inheritance 
+0

के रूप में अन्य लोगों ने कहा, एक वर्ग एक बार में दो वर्गों से विरासत में नहीं कर सकते हैं (यानी 'फैली, b' या कुछ और) – alxbl

+0

क्या यही कारण है कि: हालांकि, अगर यह वास्तव में जरूरत है, तो आप इस तरह के तरीके का उपयोग कर सकते हैं मैं ऐसा करने की सोच रहा था लेकिन तब मुझे नहीं लगता था कि यह मुख्य माता-पिता से सामान प्राप्त करेगा। इस मामले में कौन सा वर्ग अभिभावक है? गैर-अभिभावक से आप फ़ंक्शंस/विधियों तक कैसे पहुंच सकते हैं? – Brett

+0

'Your_Class' से आप उन्हें सामान्य रूप से' $ this-> विधि() 'का उपयोग करके कॉल कर सकते हैं ... प्रत्येक 'संरक्षित' और 'सार्वजनिक' सदस्य विरासत में मिलेगा। 'चाइल्ड'' Your_Class' का अभिभावक है लेकिन बहुरूपता से 'अभिभावक' का एक प्रकार-संकेत 'Your_Class' ऑब्जेक्ट को भी स्वीकार करेगा। * मुझे लगता है कि दिखाने के लिए * – alxbl

8

कोई php एक विरासत भाषा है। यदि आप php 5.4 में आगामी सुविधा देख सकते हैं, तो यह विशेषता है।

2

एक हाँ/नहीं जवाब मैं कह सकता हूँ नहीं है। आप PHP में एकाधिक कक्षाओं से विस्तार नहीं कर सकते हैं। लेकिन आप इसके बजाय interface का उपयोग कर सकते हैं।

0

आप पीछे सोचकर ऐसा कर सकते हैं, हालांकि यह स्थिति पर निर्भर करता है। यदि आप अपनी कक्षाओं को अलग रखना चाहते हैं, तो कोई भी आपको अपने ऑब्जेक्ट्स और विरासत को कैसे व्यवस्थित करने का अच्छा जवाब दे सकता है जबतक कि आप हमें अधिक जानकारी न दें। यह भी ध्यान रखें कि कक्षा संरचना प्राप्त करने के बारे में बहुत चिंतित होना छोटी परियोजनाओं में बोझ है और आप विधियों को भी आगे बढ़ा सकते हैं और इसके साथ किया जा सकता है और बाद में कक्षाओं के बारे में और जानेंगे।

8

के रूप में कहा @morphles, इस सुविधा लक्षण php 5.4 में (अन्य भाषाओं में mixins की तरह) के रूप में उपलब्ध हो जाएगा।

// your class #1 
class A { 
    function smthA() { echo 'A'; } 
} 

// your class #2 
class B { 
    function smthB() { echo 'B'; } 
} 

// composer class 
class ComposeAB { 
    // list of implemented classes 
    private $classes = array('A', 'B'); 
    // storage for objects of classes 
    private $objects = array(); 

    // creating all objects 
    function __construct() { 
     foreach($this->classes as $className) 
      $this->objects[] = new $className; 
    } 

    // looking for class method in all the objects 
    function __call($method, $args) { 
     foreach($this->objects as $object) { 
      $callback = array($object, $method); 
      if(is_callable($callback)) 
       return call_user_func_array($callback, $args); 
     } 
    } 
} 

$ab = new ComposeAB; 
$ab->smthA(); 
$ab->smthB(); 
+0

वैकल्पिक हल उदाहरण :) – Brett

+0

आपका स्वागत है के लिए धन्यवाद) मेरे लिखें अगर आप अपनी आवश्यकताओं के लिए इसे बदल नहीं सकता कोड उदाहरण के लिए विस्तार का एक सा जोड़ा। – RReverser

+0

क्या यह काम करेगा यदि कंपोज़ब को एक इंटरफ़ेस को लागू करने की आवश्यकता है जो ए और बी में फ़ंक्शंस निर्दिष्ट करता है? कल्पना करें कि इंटरफ़ेस में smthA और smthB था, कंपोज़बैब ने इस तरह के एक इंटरफेस को लागू किया, क्या __call फ़ंक्शन इंटरफ़ेस की आवश्यकताओं को पूरा करेगा? – CMCDragonkai