2013-06-24 8 views
6

मेरे पास एक इंटरफ़ेस है जो कार्यान्वयन आवश्यकताओं के तरीकों की घोषणा करता है जैसे खोज, findOrFail इत्यादि, मूल रूप से लैरवेल बोलने वाले तरीकों।इंटरफ़ेस विधियों को सूचित करना __call के माध्यम से लागू किया गया है?

मैं इन तरीकों को इंटरफ़ेस में घोषित करता हूं क्योंकि इंटरफ़ेस लागू करने वाली हर चीज स्पष्ट रूप से विस्तारित नहीं होगी, इसलिए मैं उन्हें इंटरफ़ेस में घोषित करता हूं, इसलिए मेरा ऐप हमेशा जानता है कि विधियां वहां जा रही हैं।

क्या मैं जानना चाहता हूँ, है मॉडल है कि वाक्पटु मॉडल का विस्तार करना में public function find($id){return parent::find($id)} प्रकार के तरीकों का एक समूह होने के अलावा अन्य वहाँ एक आसान तरीका यह बताने के लिए इंटरफ़ेस पता है कि विधि __call के माध्यम से नियंत्रित किया जाता है है?

+0

भी देखें: https: //bugs.php.net/bug.php?id=41162। –

उत्तर

3

नहीं यह काम नहीं करेगा। जबकि __call() गतिशील कोडिंग शैली के लिए वास्तव में अच्छा है, इसके नुकसान यह है कि आप इंटरफ़ेस में गतिशील विधियों के हस्ताक्षर को लागू नहीं कर सकते हैं और आपको इसके लिए स्वचालित दस्तावेज नहीं मिलेगा।

लेकिन मुझे लगता है कि यदि आप उन बिंदुओं पर हैं जहां आप उन तरीकों के लिए इंटरफ़ेस बनाना चाहते हैं, तो अब __call() का उपयोग करने की आवश्यकता नहीं होनी चाहिए। मैं सिर्फ हार्डकोड विधियों का उपयोग करता हूं।

+0

लगता है कि आपके पास एक डिज़ाइन समस्या है। अधिक मदद करना चाहते हैं लेकिन सवाल थोड़ा अस्पष्ट है। क्या आप एक मूल उदाहरण दिखा सकते हैं? – hek2mgl

4

हालांकि इस तरह की डिजाइन की सफाई करने के लिए के रूप में एक बड़ा सवाल है, तो आप एक विशेषता है जो इंटरफेस के तरीकों को लागू करता है का उपयोग करके कुछ इस के लिए समान पूरा कर सकते हैं हो सकता है:

interface FindableContract { 
    public function find($id); 
} 

trait MagicFindableTrait { 
    public function find($id) { 
     return static::__call(__FUNCTION__, func_get_args()); 
    } 
} 

class MagicalParent { 
    public function __call($method, $args) { 
     if ($method == 'find') { 
      return "User " . $args[0] . " is a witch! May we burn her?!"; 
     } 
    } 
} 

class User extends MagicalParent implements FindableContract { 
    use FindableTrait; 
} 

class NonmagicalUser implements FindableContract { 
    public function find($id) { 
     return "User $id was found to be nonmagical. Let's burn him anyway."; 
    } 
} 

print (new User)->find(123); 
print (new NonmagicalUser)->find(321); 
+1

अंत में मैंने ऊपर उठाने का फैसला किया, क्योंकि मुझे लगता है कि यह वास्तव में चालाक है। मैं थोड़ी देर के लिए हिचकिचाहट क्योंकि मुझे लगता है कि यह वास्तव में चालाक है। –

+1

मैं डेनिस से सहमत हूं, यह आमतौर पर एक बहुत बुरा विचार बोल रहा है। इस तरह के कुछ के लिए प्राथमिक उपयोग अकादमिक/जिज्ञासा/कटौती है। यह शायद वास्तविक दुनिया कोड में इस्तेमाल नहीं किया जाना चाहिए। – Gabriel

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

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