PHP में OOP इंटरफेस
जैसा कि आप पहले से ही जानते हैं, अमूर्त कक्षाएं (abstract classes) अपने वंशजों के लिए विधियों का एक सेट प्रस्तुत करती हैं। इन विधियों का एक हिस्सा खुद ही कक्षा में लागू किया जा सकता है, और कुछ विधियों को अमूर्त घोषित किया जा सकता है और जिन्हें बाल कक्षाओं में लागू करने की आवश्यकता होती है।
अपने आप को एक ऐसी स्थिति की कल्पना करें जहां आपकी अमूर्त कक्षा केवल अमूर्त सार्वजनिक विधियों का एक सेट है, बिना कार्यान्वयन वाली विधियों को जोड़े।
वास्तव में आपकी मूल कक्षा आपके वंशजों का इंटरफेस वर्णन करती है, यानी उनकी सार्वजनिक विधियों का सेट, जिन्हें लागू करना अनिवार्य है।
हमें इसकी आवश्यकता क्यों है: प्रोग्रामिंग करते समय कम गलतियाँ करने के लिए - सभी आवश्यक विधियों का वर्णन मूल-कक्षा में करने से, हम आश्वस्त रह सकते हैं कि सभी वंशज वास्तव में उन्हें लागू करेंगे।
यह कब मदद करेगा: मान लीजिए हम अपनी मूल-कक्षा और उसके कई वंशज बनाते हैं। यदि बाद में कुछ समय बाद, उदाहरण के लिए, एक महीने बाद, हम एक और वंशज बनाने का निर्णय लेते हैं, तो निश्चित रूप से हम अपने कोड की बारीकियों को भूल चुके होंगे और संभवतः नए वंशज में किसी विधि का कार्यान्वयन लिखना भूल सकते हैं। हालाँकि, PHP स्वयं ही विधि को खोने नहीं देगा - और बस एक त्रुटि दे देगा।
यही बात किसी अन्य प्रोग्रामर पर भी लागू होती है, जो आपके प्रोजेक्ट पर काम कर रहा हो। मान लीजिए मूल-कक्षा का कोड आपने लिखा, और फिर आपके सहयोगी ने उसका एक और वंशज बनाने का फैसला किया। आपके सहयोगी के लिए भी कुछ विधियों को खोना संभव नहीं होगा।
हालाँकि, एक समस्या है: वास्तव में हमने अपनी मूल-कक्षा इसलिए बनाई ताकि उसमें अमूर्त सार्वजनिक विधियाँ लिख सकें, लेकिन हम स्वयं या हमारे सहयोगी के पास गलती से इस कक्षा में गैर-सार्वजनिक विधि या गैर-अमूर्त विधि जोड़ने का अवसर है।
मान लीजिए हम भौतिक रूप से मूल कक्षा में अमूर्त सार्वजनिक के अलावा अन्य विधियाँ करने पर रोक लगाना चाहते हैं। PHP में इसके लिए अमूर्त कक्षाओं के बजाय इंटरफेस का उपयोग किया जा सकता है।
इंटरफेस ऐसी कक्षाएं हैं, जिनकी सभी विधियाँ सार्वजनिक होती हैं और जिनमें कोई कार्यान्वयन नहीं होता। विधियों का कोड इंटरफेस के वंशज-कक्षाओं द्वारा लागू किया जाना चाहिए।
इंटरफेस को भी सामान्य कक्षाओं की तरह ही
घोषित किया जाता है, लेकिन class शब्द के बजाय
कीवर्ड interface का उपयोग करके।
इंटरफेस से विरासत पाने के लिए
थोड़ा अलग शब्दावली का उपयोग किया जाता है:
कहा जाता है कि
कक्षाएं इंटरफेस से विरासत नहीं लेतीं, बल्कि उन्हें लागू करती
हैं। तदनुसार, कीवर्ड extends के बजाय
कीवर्ड implements का उपयोग करना चाहिए।
इंटरफेस की कोई वस्तु (object) नहीं बनाई जा सकती। इंटरफेस की सभी विधियों
को public के रूप में घोषित किया जाना चाहिए
और उनमें कोई कार्यान्वयन नहीं होना चाहिए। इंटरफेस में
केवल विधियाँ हो सकती हैं, गुण (properties) नहीं।
एक ही नाम के साथ इंटरफेस और कक्षा भी नहीं बनाई जा सकती।