2013-10-02 5 views
7

मैं इंटरफेस हो होना चाहिएपीएचपी - - इंटरफ़ेस विरासत घोषणा संगत

class ActiveRecordBase 
{ 
    ... 
} 

class Product extends ActiveRecordBase 
{ 
    ... 
} 

========

लेकिन मैं कर सकते हैं ' टी ऐसा करते हैं:

interface ExactMapper implements AbstractMapper 
{ 
    public function objectToArray(Product $object); 
} 

या इस:

interface ExactMapper extends AbstractMapper 
{ 
    public function objectToArray(Product $object); 
} 

मैं त्रुटि "घोषणा संगत होना चाहिए"

तो, वहाँ PHP में यह करने के लिए एक रास्ता है मिल गया है?

+1

मैं जानते हैं कि यह अब कुछ साल पहले पोस्ट किया गया था, लेकिन यहाँ मेरे दो cents- यह त्रुटि संदेश नहीं करने के लिए है इंटरफेस विरासत के साथ। यह त्रुटि इसलिए है क्योंकि PHP वास्तविक फ़ंक्शन/विधि ओवरलोडिंग का समर्थन नहीं करता है, जैसे कि अन्य भाषाओं (जैसे जावा, सी ++) में जिसका उपयोग आप शायद कर रहे हैं। – anotheruser1488182

उत्तर

10

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

आप हमेशा मैन्युअल ज़ाहिर है, कोड में देख सकते हैं:

if (!($object instanceof Product)) { 
    throw new InvalidArgumentException; 
} 
+0

लेकिन मैं उस पर आधारित एक और इंटरफ़ेस बनाने का प्रयास करता हूं। लागू नहीं है, लेकिन प्रतिबंध के साथ विरासत। – violarium

+0

इससे कोई फर्क नहीं पड़ता कि आप विस्तार या कार्यान्वित करते हैं या नहीं। आप एक इंटरफेस घोषणा, अवधि नहीं बदल सकते हैं। आप यह नहीं कह सकते कि फू बार लागू करता है जब बार का कार्यान्वयन फू निर्दिष्ट किए गए से कहीं अधिक प्रतिबंधित है। – deceze

-3
interface iInvokable { 
    function __invoke($arg = null); 
} 

interface iResponder extends iInvokable { 
    /** Bind next responder */ 
    function then(iInvokable $responder); 
} 

class Responder implements iResponder { 

    function __invoke($arg = null) 
    { 
     // TODO: Implement __invoke() method. 
    } 

    /** Bind next responder */ 
    function then(iInvokable $responder) 
    { 
     // TODO: Implement then() method. 
    } 
} 

class OtherResponder implements iResponder { 

    function __invoke($arg = null) 
    { 
     // TODO: Implement __invoke() method. 
    } 

    /** Bind next responder */ 
    function then(iInvokable $responder) 
    { 
     // TODO: Implement then() method. 
    } 
} 

class Invokable implements iInvokable { 

    function __invoke($arg = null) 
    { 
     // TODO: Implement __invoke() method. 
    } 
} 

$responder = new Responder(); 
$responder->then(new OtherResponder()); 
$responder->then(new Invokable()); 
संबंधित मुद्दे