2016-03-28 5 views
7

मैं दो पीएचपी लक्षण है कि प्रत्येक एक ही 3 विशेषता से विरासत है:विशेषता टकराव से परहेज - use_once?

trait C { 
    public function smallTalk() { 
     echo 'c'; 
    } 
} 

trait A { 
    use C; 
    public function ac() { 
     echo 'a'.smallTalk(); 
    } 
} 

trait B { 
    use C; 
    public function bc() { 
     echo 'b'.smallTalk(); 
    } 
} 

और मैं उन दोनों को एक कक्षा में उपयोग करना चाहते हैं:

class D { 
    use A, B; 
    public function acbc() { 
     echo ac().bc(); 
    } 
} 

लेकिन मैं त्रुटि

मिलती रहती है

Fatal error: Trait method smallTalk has not been applied, because there are collisions with other trait methods on D

मुझे पता है use_once कोई बात नहीं है, लेकिन मैं उसी कार्यक्षमता की तलाश कर रहा हूं जो require_once या include_once प्रदान करता है, लेकिन लक्षणों के लिए। यह उदाहरण सरलीकृत है। मेरा असली C में कई विधियां हैं और 2 से अधिक लक्षणों से विरासत में मिला है, इसलिए जब भी मैं इनमें से 1 से अधिक लक्षणों का उपयोग करता हूं, तो मैं वास्तव में insteadof की लंबी स्ट्रिंग को दोहराना नहीं चाहता हूं। Conflict Resolution

If two Traits insert a method with the same name, a fatal error is produced, if the conflict is not explicitly resolved.

To resolve naming conflicts between Traits used in the same class, the insteadof operator needs to be used to choose exactly one of the conflicting methods.

Since this only allows one to exclude methods, the as operator can be used to allow the inclusion of one of the conflicting methods under another name.

उदाहरण::

+0

लघु संस्करण: नहीं, मैन्युअल रूप से टकराव से निपटने लक्षण प्रयोग करने के लिए कीमत है। – VolkerK

+0

मुझे संदेह है कि आप लक्षणों का दुरुपयोग कर रहे हैं। मैं केवल अंतिम उपाय के रूप में लक्षणों का उपयोग करता हूं। इस उत्तर में विकल्पों पर एक अच्छा स्पष्टीकरण है (सी ++ में, लेकिन वे ज्यादातर किसी भी ओओपी भाषा पर लागू होते हैं) http://stackoverflow.com/questions/406081/why-should-i-avoid-multiple-inheritance-in-c# उत्तर -407928 – Pevara

उत्तर

0

आप पढ़ जरूरत

<?php 
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; 
    } 
} 
+0

क्या आपने प्रश्न पढ़ा था? "मेरे असली सी में बहुत से तरीके हैं और 2 से अधिक लक्षणों से विरासत में मिला है, इसलिए मैं वास्तव में इन लक्षणों में से 1 से अधिक का उपयोग करने के बजाय हर समय एक लंबी स्ट्रिंग को दोहराना नहीं चाहता हूं।" मुझे पता है कि मैं जो कह रहा हूं वह कर सकता हूं, लेकिन मैं पूछ रहा था कि _better_ समाधान था या नहीं। – wogsland

+1

आप अन्य माध्यमों से संघर्ष को हल करने में सक्षम नहीं होंगे। विशेषता + विस्तारित का प्रयोग करें। यदि आप सबकुछ "सही" करना चाहते हैं - विशेषता की सहायता से सबकुछ करने की कोशिश न करें। आप सी से एक कक्षा सी डी को एक वास्तविक उदाहरण के बिना बढ़ा सकते हैं - यह कहने में मुश्किल है कि कौन सा आर्किटेक्चर सत्य होगा। मैं सोल्ड से परिचित होने की सलाह देता हूं। यह वास्तुकला का चयन करने में सहायता कर सकता है। –

+0

उपरोक्त क्योंकि यह सही उत्तर है, भले ही ओपी को यह पसंद न हो कि यह सही जवाब है। – mopsyd

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