क्या कोई क्लास एक क्लास का विस्तार कर सकता है और एक इंटरफ़ेस लागू कर सकता है


100

क्या एक वर्ग PHP में एक इंटरफ़ेस और दूसरी कक्षा दोनों का विस्तार कर सकता है?
मूल रूप से मैं यह करना चाहता हूं:

interface databaseInterface{
 public function query($q);
 public function escape($s);
 //more methods
}

class database{ //extends both mysqli and implements databaseInterface
 //etc.
}

कोई यह कैसे करेगा, बस कर रहा है:

class database implements databaseInterface extends mysqli{ 

एक घातक त्रुटि के परिणाम:

पार्स त्रुटि: सिंटैक्स त्रुटि, अप्रत्याशित T_EXTENDS, लाइन * लाइन * पर * फ़ाइल * में '{' की अपेक्षा

18
यह कैसे स्थानीयकृत है ?! "यह सवाल भविष्य के किसी भी आगंतुक की मदद करने की संभावना नहीं है"। फिर भी सबसे अच्छे उत्तर में 33 उत्थान हैं और प्रश्न 4 सितारे हैं!
द्वैत_३ dual ’३३

जवाबों:


177

इसे दूसरे तरीके से आज़माएँ:

class database extends mysqli implements databaseInterface { ...}

यह काम करना चाहिए।


आह, बहुत बहुत धन्यवाद। वास्तव में ऐसा क्यों है कि उन्हें दूसरे तरीके से घूमना चाहिए?
जगर

14
चूंकि आप केवल एक वर्ग का वारिस कर सकते हैं और आप किसी भी संख्या में इंटरफेस को लागू कर सकते हैं, यह संभवतः एक वाक्यविन्यास चीनी चीज थी। इसके अलावा, याद रखें, यदि आपका उपवर्ग किसी भी इंटरफेस को लागू करता है, तो यह लागू तरीकों की सूची में भी दिखाई देगा। इसलिए उन्हें उस क्रम में रखना कुछ मायने रखता है।
ड्रू

क्या यह एक बुरा अभ्यास है?
मोहम्मद शमशीद

21

हाँ यह कर सकते हैं। आपको बस सही क्रम बनाए रखने की आवश्यकता है।

class database extends mysqli implements databaseInterface { ... }

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

हालाँकि, मैं आपको यह चेतावनी देने के लिए बाध्य हूं कि मेरीक्क्लि कक्षा का विस्तार अविश्वसनीय रूप से बुरा विचार है । ऑब्जेक्ट प्रति प्रोग्रामिंग में शायद प्रति सबसे अधिक दुरुपयोग और दुरुपयोग की अवधारणा है।

इसके बजाय मैं db-related सामान mysqli way (या PDO तरीका) करने की सलाह दूंगा।

इसके अलावा, एक मामूली बात है, लेकिन नामकरण परंपराएं मायने रखती हैं। आपकी कक्षा databaseतब और अधिक सामान्य लगती है mysqli, इसलिए यह बताती है कि उत्तरार्द्ध से विरासत में मिली है, databaseन कि आसपास का रास्ता।


1
क्यों mysqli वर्ग एक बुरा विचार बढ़ा रहा है?
पिम जगेर

11
पहला, क्योंकि यह तुम्हारा नहीं है। जब mysqli लोग कुछ बदलने का फैसला करेंगे तो उपवर्ग का व्यवहार भी बदल जाएगा। दूसरा, वंशानुक्रम का उपयोग विशेष कार्यक्षमता के लिए किया जाता है, अतिरिक्त कार्यक्षमता के साथ नहीं। यह OOP की सबसे गलत बात है। अंगूठे के एक नियम के रूप में मैं केवल अमूर्त कक्षाओं का विस्तार करता हूं।
मिचेल रुडनिक

मिशल - mysqli के लिए एक बदलाव एक डेवलपर के लिए किसी भी अलग कैसे होगा जो एक समग्र / एक बनाम एक बहुरूपिक दृष्टिकोण का उपयोग करता है? परिवर्तनों को संभालने के लिए आपको अभी भी अपना कोड अपडेट करना होगा।
पीटर बेली

2
मैं एडेप्टर पैटर्न से परिचित हूं। मैं सिर्फ यह कह रहा हूं कि यदि कोई विधि नाम बदल जाता है या पदावनत हो जाता है, तो भी आपको दोनों परिदृश्यों में कोड बदलने की आवश्यकता होगी। हालांकि मैं मानता हूं कि इस परिदृश्य में एक गैर-बहुरूपी दृष्टिकोण बेहतर है, मैं इस धारणा को नहीं खरीदता हूं कि एक एडेप्टर बदलने के लिए "प्रतिरक्षा" होगा।
पीटर बैली

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

6

हाँ, यदि आप कई इंटरफेस लागू करना चाहते हैं, तो आप इस तरह से कर सकते हैं:

public class MyClass extends BaseClass implements myInterface1, myInterface2, myInterface3{ 

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.