2012-10-15 15 views
17

मैं कक्षाओं के एक सेट के लिए एक इंटरफ़ेस का उपयोग कर रहा हूं। मुझे एक समस्या है हालांकि मैं इंटरफ़ेस में अनुमति देने के लिए visibility की आवश्यकता है (वह है: public, protected और private)।PHP इंटरफेस: किसी भी दृश्यता निर्दिष्ट करें

मैं माता पिता विधि केवल संरक्षित किया जाना है और मैं बच्चे को विधि की जरूरत निजी होने की जरूरत है, लेकिन मैं कह

Fatal error: Access type for interface method Baz::qux() must be omitted in <the file with Baz/Bar>."

मैं inteface Baz में अन्य दृश्यता तरीकों को निर्दिष्ट और public को दूर करने की कोशिश की त्रुटि मिलती है, लेकिन वे सभी असफल रहे।

क्या इंटरफ़ेस के माध्यम से मैं इसे कर सकता हूं? यदि नहीं, तो क्या कोई तरीका है कि मैं इसे abstract घोषित कर सकता हूं, मैंने कोशिश की, लेकिन असफल रहा।

interface Baz 
{ 
    public function qux(); 
} 

class Bar implements Baz 
{ 
    protected function qux() 
    { 
     //do foo 
    } 
} 

class Foo extends Bar implements Baz 
{ 
    private function qux() 
    { 
     parent::qux(); 
    } 
} 
+3

जब भी आपको ऐसी चीज की आवश्यकता होती है, तो आमतौर पर यह एक मजबूत संकेत है कि आपकी अवधारणा में कुछ गड़बड़ है। – Niko

+0

मेरी माफ़ी, अब मुझे यह पता है। सभी जानकारी के लिए धन्यवाद। – PolishHurricane

+0

एक इंटरफ़ेस केवल एक वायरफ़्रेम है, इसलिए आप –

उत्तर

38

Interfaces में आपके द्वारा घोषित किए जाने वाले तरीके सार्वजनिक होना चाहिए। आप एक इंटरफेस के साथ एक अनुबंध परिभाषित करते हैं। कोई गैर-सार्वजनिक विधियां कार्यान्वयन विवरण होंगी और वे इंटरफ़ेस में नहीं हैं।

विकिपीडिया से:

Programming to the interface

The use of interfaces allows a programming style called programming to the interface. The idea behind this is to base programming logic on the interfaces of the objects used rather than on internal implementation details. Programming to the interface reduces dependency on implementation specifics and makes code more reusable.[7] It gives the programmer the ability to later change the behavior of the system by simply swapping the object used with another implementing the same interface.

+0

मेरे पास' __call() 'विधि है जो प्रीफ़िक्स के साथ संपत्ति के समान नाम के साथ संरक्षित विधि को कॉल करती है। '$ ऑब्जेक्ट-> नाम 'कॉल तक पहुंच सुरक्षित' $ ऑब्जेक्ट-> getName()'। इस मामले में, निजी या संरक्षित विधि के इंटरफेस में कुछ समझ हो सकती है? मुझे यकीन नहीं है। –

+1

@IvanMontilla ने कहा उपयोग के लिए एक इंटरफ़ेस समझ में नहीं आता है, क्योंकि इंटरफ़ेस का लक्ष्य किसी भी वर्ग के बाहरी उपयोग के लिए लक्षित है। यदि आप संरक्षित तरीकों के रूप में लगातार, विरासत में व्यवहार को मजबूर करना चाहते हैं, तो आप एक अमूर्त वर्ग का उपयोग एक अमूर्त विधि के साथ कर सकते हैं, जो उस सार तत्व को लागू करने के लिए उस सार वर्ग को विस्तारित करने के लिए मजबूर कर रहा है (जब तक ये वर्ग स्वयं सार नहीं हैं)। (यह भी है कि JvdBerg का अर्थ उनके [उत्तर] (http://stackoverflow.com/a/12898500/1645553) के साथ इस प्रश्न में है।) – jaffog

13

एक इंटरफेस 2 पार्टियों, एक समझौता है कि वे कैसे संवाद के बीच एक अनुबंध है।

विधियों को सुरक्षित या निजी बनाने का कोई मतलब नहीं है, क्योंकि दूसरी पार्टी उनको नहीं देख पाएगी।

0

देवों ने अधिक तरल पदार्थ पुन: उपयोग के लिए दृश्यता को अक्षम कर दिया। कीवर्ड implements के माध्यम से आप पहले से ही एक कक्षा में एक इंटरफ़ेस बांधते हैं। आप इसे लागू किए बिना इंटरफ़ेस तक नहीं पहुंच सकते हैं।

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