2010-10-13 18 views
5

आश्चर्य है कि यह संभव है या PHP की सीमा है, आसपास घूमना मामला लगता है लेकिन शायद मुझे यहां एक चालाक समाधान याद आ रहा है।कोडनिर्देशक और एकाधिक विरासत?

उम्मीद है कि यह समझ में आएगा। अभी मेरे पास मेरी साइट, एक व्यवस्थापक और ग्राहक पक्ष के दो भाग हैं। मैं इसे दो नियंत्रकों (व्यवस्थापक और क्लाइंट) में विभाजित करने में सक्षम हूं जो आधार MY_Controller क्लास से प्राप्त होते हैं, लेकिन मेरी समस्या मेरे प्रमाणीकरण नियंत्रक को कार्यान्वित कर रही है।

क्लाइंट/एडमिन लॉग इन के बीच बहुत सी साझा कोड है, और अभी मुझे या तो प्रत्येक व्यवस्थापक और क्लाइंट के लिए एक ऑथ नियंत्रक बनाना होगा जो आधार को बढ़ाता है (जिसका अर्थ है कि बहुत दोहराया गया कोड), या बस MY_Controller क्लास का विस्तार करें और प्रत्येक फ़ंक्शन में if/thens का उपयोग करें, जो तब गन्दा हो जाता है (और व्यवस्थापक/क्लाइंट पैरेंट क्लासेस को भी छोड़ देता है जो उन्हें रखने के उद्देश्य को हरा देता है ...)।

मुझे आश्चर्य है कि क्या ऑथ नियंत्रक "तटस्थ" (?) होना है और व्यवस्थापक/क्लाइंट नियंत्रकों से प्राप्त करने में सक्षम है, इसलिए यदि एक्स बेस नियंत्रक है, और वाई ऑथ है ...

X -> Admin Controller -> Y 
X -> Client Controller -> Y 

मैं एक प्रमाणीकरण पुस्तकालय का उपयोग कर रहा निचले स्तर कार्यों में से कुछ को संपुटित करने के लिए और नहीं बल्कि है कि वहाँ की तरह लेआउट तर्क और सामान चिपके नहीं होगा। मुझे माफ़ कर दो अगर यह एक बेवकूफ सवाल है। धन्यवाद!

+0

अगर आप पाया एक और जवाब तो [बंद] के लिए इस विषय का नाम बदलें या अपने जवाब के रूप में एक जवाब को चिह्नित किया है – ITroubs

उत्तर

3

एकाधिक विरासत संभव नहीं है। आप या तो इंटरफेस का उपयोग कर सकते हैं या आप इस तरह आगंतुक designpattern उपयोग कर सकते हैं:

<?php 

class A { 
    public $avar = 'I\'m A'; 
    function accept(Visitor $v){ 
     $v->visitA($this); 
    } 
} 

class B { 
    public $bvar = 'B reporting'; 
    function accept(Visitor $v){ 
     $v->visitB($this); 
    } 
} 


class Visitor { 
    function visitA(A $a){ 
     echo $a->avar; 
    } 

    function visitB(B $b){ 
     echo $b->bvar; 
    } 
} 


$A = new A(); 
$B = new B(); 
$visitor = new Visitor(); 

$A->accept($visitor); 
$B->accept($visitor); 

?> 

दुर्भाग्य php तैयार नहीं है जावा में की तरह उनके पैरामीटर द्वारा विधि कॉल भेद करने के लिए जहां यह उदाहरण है कि कैसा दिखेगा अभी तक:

class A { 
    public String avar = 'I\'m A'; 
    function accept(Visitor v){ 
     v.visit(this); 
    } 
} 

class B { 
    public String bvar = 'B reporting'; 
    function accept(Visitor v){ 
     v.visit(this); 
    } 
} 


class Visitor { 
    function visit(A a){ 
     System.out.println(a.avar); 
    } 

    function visit(B b){ 
     System.out.println(b.bvar); 
    } 
} 


A = new A(); 
B = new B(); 
visitor = new Visitor(); 

A.accept(visitor); 
B.accept(visitor); 

जहां अपने मापदंडों के प्रकार द्वारा प्रतिष्ठित कई यात्रा तरीकों

+0

तो यहां आप Admincontroller-> स्वीकार करें ($ विज़िटर) जैसे कुछ कर सकते हैं और विज़िटर में आपके पास दो विधियां हैं जिन्हें एक का नाम दिया गया है एडमिन और दूसरे को विज़िट यूज़र नाम दिया गया है और जब आप उस नियंत्रक के प्रकार को नहीं जानते जिसे विज़िट करना है यह कोई समस्या नहीं है क्योंकि आप नियंत्रक को आगंतुक देते हैं और वह निर्णय लेता है कि – ITroubs

+0

पर कॉल करने के लिए कौन सी विज़िटर विधि आपको केवल स्वीकृति विधि के साथ थोड़ा विज़िटर इंटरफ़ेस लागू करना चाहिए और दो नियंत्रक को उस इंटरफ़ेस को लागू करने दें ताकि आप अपने तरीकों में टाइपिंग का उपयोग कर सकें जहां आप अपना कंट्रोलर देते हैं ताकि आप शर्मिंदा हो सकें कि उनके पास उस विधि को स्वीकार किया गया है – ITroubs

+0

इस विधि के साथ खेलने का प्रयास! – Jeff

0

PHP के साथ एकाधिक विरासत संभव नहीं है। मैं सोच रहा हूं कि, आपको दो अलग-अलग लॉगिन नियंत्रकों की आवश्यकता क्यों होगी? क्या आप समझ सकते हैं कि आप नियंत्रकों में क्या कर रहे हैं?

संपादित करें: अपने कोड इस की अनुमति देता है, लेकिन आप ग्राहक नियंत्रक में सभी सामान्य भागों डाल की कोशिश कर सकते और व्यवस्थापक नियंत्रक इस एक से विस्तार करते
सुनिश्चित नहीं हैं।

X -> Admin Ctrlr -> Client Ctrlr -> Y 
X -> Client Ctrlr -> Y 
+0

खैर मैं लॉगिन/regist के लिए अलग तर्क है इस पर निर्भर करता है कि उपयोगकर्ता वेबसाइट के व्यवस्थापक या ग्राहक भाग पर है या नहीं। उदाहरण के लिए, यदि उपयोगकर्ता व्यवस्थापक भाग पर पंजीकरण कर रहा है, तो मैं कुछ और फॉर्म फ़ील्ड को संसाधित करता हूं, या एक आमंत्रण कोड पूछता हूं, आदि। लॉगिन के भाग भी हैं, जैसे पासवर्ड भूलना, रीसेट करना आदि। – Jeff

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