2011-03-01 10 views
7

क्या दो अलग-अलग, असंबंधित इंटरफेस के लिए संकेत टाइप करने के लिए PHP में कोई तरीका है? उदाहरण के लिए:एकाधिक असंबद्ध इंटरफेस के लिए संकेत टाइपिंग

interface errorable { 
    function error($msg); 
} 

interface recordable { 
    ssh_for_recorder(); 
} 

class uploader__module extends base__module implements errorable, recordable { 
    public function ssh_for_recorder() { 
     return new ssh2; 
    } 
    public function error($msg) { 
     $this->errors[] = $msg; 
    } 

    public function upload() { 
     $recorder = new recorder($this); 
     $recorder->run(); 
    } 
} 

class recorder { 
    private $ssh2; 
    private $module; 
    private function upload() { 
     if (!$this->ssh2) { 
     $this->module->error("No SSH2 connection"); 
     } 
    } 
    public function __construct({recordable,errorable} $module) { 
     $this->module = $module; 
     $this->ssh2 = $module->ssh_for_recorder(); 
    } 
} 

आप उपरोक्त कोड में देख सकते हैं, रिकॉर्डर वर्ग अपनी मॉड्यूल error() और ssh_for_recorder() दोनों है, लेकिन इन अलग इंटरफेस द्वारा परिभाषित कर रहे चलाने की क्षमता की अपेक्षा करता है। त्रुटि योग्य रिकॉर्ड करने योग्य नहीं है और इसके विपरीत।

क्या ऐसा करने के लिए कोई अच्छा अभ्यास है? मैं एक इंटरफ़ेस बनाने की सोच रहा था जो रिकॉर्ड करने योग्य और त्रुटिपूर्ण से विस्तारित करता है और अपलोड__ मॉड्यूल को कार्यान्वित करता है, लेकिन मुझे नहीं पता कि इसे क्या कॉल करना है।

+0

टाइपिंग संकेत के साथ इसका क्या संबंध है? – Hamish

+1

रिकॉर्डर के लिए निर्माता देखें। मैं दोनों रिकॉर्ड करने योग्य और त्रुटि योग्य संकेत लिखना चाहता हूं। –

+0

मुझे लगता है कि @ हैमिश भ्रमित हो रहा है, PHP में संकेत देने के लिए कक्षा को एक निश्चित प्रकार का होना आवश्यक है, जहां @tandu को गुणांक प्रकारों के इंटरफेस की जांच करने की आवश्यकता होती है। – RobertPitt

उत्तर

10

नहीं, यह php में संभव नहीं है।

अन्य भाषाओं (ज्यादातर कार्यात्मक) हैं जो इस सुविधा का समर्थन करते हैं जिसे संघ प्रकार (http://en.wikipedia.org/wiki/Sum_type) कहा जाता है।

+0

PHP में इसके आसपास जाने के लिए आप कैसे सुझाव देंगे? –

+0

अच्छा, एक नया इंटरफ़ेस बनाएं जो रिकॉर्ड करने योग्य और त्रुटि दोनों को बढ़ाता है। हालांकि आपको उन वर्गों को बदलना होगा जो इसके बजाय नए इंटरफेस को लागू करने के लिए दोनों इंटरफेस को लागू करते हैं। – linepogl

+0

जैसा मैंने सोचा था। मैं रिकार्ड करने योग्य त्रुटि को समाप्त करने के लिए समाप्त हुआ ताकि मेरे आवेदन में भी काम किया। –

6

पीएचपी भीतर ही हैक इसलिए की तरह विधि के भीतर आप के लिए चेक करने के लिए एक सहायक समारोह है:

function CheckInterfaces($object,array $interfaces) 
{ 
    foreach($interfaces as $i) 
    { 
     if(!is_a($object,$i)) 
     { 
      return false; 
     } 
    } 
    return true; 
} 

और फिर विधि के भीतर कार्य करें:

public function Something($object) 
{ 
    if(CheckInterfaces($object,array("foo","bar"))) 
    { 
     throw new ArgumentException(gat_class($object) . " Must be a member of foo,bar to be passed to Something"); 
    } 
} 

इस के चारों ओर एक और तरीका अपने आवश्यक इंटरफेस के लिए यूनियन इंटरफ़ेस बनाने के लिए IUS जारी करें, त्वरित उदाहरण

interface foobar extends foo,bar{} 

तो आपको विधि के लिए केवल foobar की आवश्यकता हो सकती है।

+1

# 1 दिलचस्प है लेकिन मुझे लगता है कि यह रास्ता overboard चला जाता है। मैं # 2 पसंद करता हूँ। बस एक नोट, हालांकि, इंटरफेस अन्य इंटरफेस का विस्तार करते हैं, वे उन्हें लागू नहीं करते हैं। आपका कोड एक वाक्यविन्यास त्रुटि का कारण बन जाएगा। –

+0

वहां छोटी निगरानी। – RobertPitt

+1

हालांकि यह एकमात्र उचित समाधान है, मुझे 2 पसंद नहीं है क्योंकि अलग-अलग इंटरफेस अलग-अलग – bencoder

0
public function __construct(recordable $recordable_module, errorable $errorable_module) { 

    if($recordable_module == $errorable_module){ 
    $module = $recordable_module; 
    } 
    $this->module = $module; 
    $this->ssh2 = $module->ssh_for_recorder(); 
} 
2

मैं इस सवाल भले ही आप पहले इस आधार पर कि दिए गए उत्तर से कोई भी वास्तव में स्वीकार्य हैं पर एक जवाब स्वीकार कर लिया है जवाब देने के लिए तय कर लिया है। जबकि स्वीकृत उत्तर तकनीकी रूप से सही है, इसके आसपास एक रास्ता है। अन्य उत्तरों के लिए, उनके कामकाज सुरुचिपूर्ण हैं और पूरी तरह से संतोषजनक नहीं हैं।

PHP एक बेहद अस्पष्ट सुविधा का समर्थन करता है जो एक इंटरफ़ेस को दूसरे से प्राप्त करने की अनुमति देता है, और वास्तव में एक इंटरफ़ेस एकाधिक आधार इंटरफेस से विरासत में सक्षम है।

उदाहरण के लिए, निम्नलिखित पूरी तरह से वैध है:

interface iFoo 
{ 
    public function doFoo(); 
} 

interface iBar 
{ 
    public function doBar(); 
} 

interface iBaz extends iFoo, iBar 
{ 
    // This interface implicitly has all the methods of iFoo and iBar 
} 

शब्दार्थ, यदि आप के लिए एक विधि/समारोह चाहते हैं केवल एक तर्क यह है कि कई इंटरफेस तो लागू करता है कि पता चलता है कि आप उम्मीद करते हैं कि कक्षाओं जाते हैं स्वीकार करते हैं कि कई इंटरफ़ेस के एक ही सेट को लागू करना वास्तव में एक इंटरफ़ेस को कार्यान्वित करना चाहिए जिसमें उन इंटरफेस को शामिल किया गया है जिन्हें आप अपना तर्क मानना ​​चाहते हैं।

आपके मामले में अगर आप कुछ है कि दोनों एक errorable और एक रिकॉर्ड करने योग्य तो आप बस निम्नलिखित इंटरफेस जोड़ने की जरूरत हैं: बस के रूप में है कि इंटरफ़ेस उम्मीद करेंगे अपनी रिकॉर्डर वर्ग के लिए

interface RecordableErrorable extends Recordable, Errorable { } 

और फिर निर्माता इसका तर्क

public function __construct(RecordableErrorable $module) { } 

एक संभावित चिपकने वाला बिंदु तब भी हो सकता है जब रिकॉर्ड करने योग्य और एक ही नाम के साथ दोनों कार्यान्वयन विधियों को त्रुटि हो। वहाँ एक संघर्ष होगा जो हल करने की आवश्यकता होगी।मुझे विश्वास है कि उस मामले को संभालने के लिए PHP में तंत्र हैं, हालांकि मैं आपको नहीं बता सका कि वे क्या हैं।

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