2009-12-09 7 views
52

क्या PHP 5 में यह एक इंटरफेस है जिसमें निजी/संरक्षित तरीके हैं?क्या ऐसा कोई इंटरफ़ेस होना संभव है जिसमें निजी/संरक्षित विधियां हों?

अभी मेरे पास है:

interface iService 
{ 
    private method1(); 
} 

एक त्रुटि फेंकता है कि:

Parse error: syntax error, unexpected T_STRING, expecting T_VARIABLE

मैं सिर्फ यह है कि यह मामला है कि एक अंतरफलक केवल सार्वजनिक तरीकों को शामिल कर सकते है पुष्टि करना चाहते हैं।

+2

मुझे उत्तर निराशाजनक लगता है। मैं उन इंटरफेस को पसंद करूंगा जो संरक्षित/निजी तरीकों का भी समर्थन करते हैं। उदाहरण के लिए, मेरे पास एक वर्ग है, जहां सार में लागू एक सार्वजनिक विधि उपclass द्वारा लागू एक संरक्षित विधि पर निर्भर करती है। मैं सारणी सार्वजनिक विधियों द्वारा आवश्यक संरक्षित तरीकों को लागू करने के लिए उप-वर्गों की आवश्यकता के लिए एक इंटरफ़ेस का उपयोग करना चाहता हूं। – Stoutie

+3

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

+2

यदि आप निजी या संरक्षित तरीकों की घोषणा कर सकते हैं, तो यह 'निजी कार्य विधि 1() होगा,' निजी विधि 1() नहीं; '। – turibe

उत्तर

88

पीएचपी manual page about interfaces पर स्पष्ट रूप से कहा गया है:

All methods declared in an interface must be public, this is the nature of an interface.

मैं यह त्रुटि आप ;-)

8

सामान्य रूप से एक इंटरफ़ेस में केवल सार्वजनिक सदस्य हो सकते हैं, क्योंकि एक इंटरफेस का एकमात्र कार्य विरासत में होना चाहिए।

PHPfreaks.com ट्यूटोरियल से

:

PHP5 features interfaces. Not to be confused with interfaces in the more general sense, the interface keyword creates an entity that can be used to enforce a common interface upon classes without having to extend them like with abstract classes. Instead an interface is implemented.

Interfaces are different from abstract classes. For one, they’re not actually classes. They don’t define properties, and they don’t define any behaviour. The methods declared in an interface must be declared in classes that implement it.

Because an interface in the more general sense is a definition of how an object interacts with other code, all methods must be declared public (see section on visibility in this chapter). Using abstract classes, an abstract method can have any visibility, but the extending classes must have their implementations use the same (or weaker) visibility. Implementing an interface adds the methods as abstract methods to the subject class, failure to implement it will result in an error like the following:

Fatal error: Class SomeConcreteClass contains n abstract method(s) and must therefore be declared abstract or implement the remaining methodsYes, abstract classes can implement interfaces.

+2

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

+3

ऐसा लगता है कि आप subclass द्वारा अमूर्त होने के लिए विधि को कार्यान्वित करना चाहते हैं। फिर किसी भी subclass इसे लागू करना होगा। लेकिन इंटरफेस के साथ इसका कोई लेना-देना नहीं है। – Sven

20

इंटरफेस एक वर्ग है कि इंटरफ़ेस को लागू करने की सार्वजनिक तरीकों का वर्णन किया जाता। इंटरफ़ेस में आपके पास कभी भी निजी विधि नहीं हो सकती है। किसी इंटरफ़ेस में किसी भी तरीके का उपयोग किया जाना चाहिए और इसे बदला नहीं जाना चाहिए।

Interfaces PHP लिंक है, लेकिन यह ओओ प्रोग्रामिंग में मानक है।

+0

जावा जैसी अन्य भाषाओं में, आप इंटरफेस में एक्सेस संशोधक का उपयोग कर सकते हैं। – BRjava

6

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

interface T { 
    public /*int*/ function f(array $a); 
} 
interface U { 
    public /*T*/ function g(T $t); 
} 

class C implements U { 
    public function g(T $t) { 
     ... 
     $x = $t->f(); 
     ... 
    } 
} 

इंटरफेस उपयोगी है क्योंकि वे राज्य, ठीक है, वस्तुओं 'इंटरफेस है। वस्तुएं उनके पर्यावरण के साथ कैसे संवाद करती हैं।

अब मान लें कि T::f निजी घोषित किया जा सकता है। यह अन्य वस्तुओं के लिए उपयोगी कैसे होगा? यह बाहर से कॉल करने योग्य नहीं होगा, यह इसके इंटरफ़ेस का हिस्सा नहीं होगा।

3

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

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

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