2009-08-28 18 views
19

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

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

इस समस्या को हल करने के लिए मेरा पहला विचार, अमूर्त विधियों के बारे में सोच रहा था जो कक्षाओं को विरासत में अतिरंजित किया जाना चाहिए। लेकिन अमूर्त तरीकों के खिलाफ अन्य तर्कों के बगल में, "अमूर्त" सिर्फ क्यों नहीं दिखाता है बेसक्लास का उपयोग अपने और क्यों नहीं किया जा सकता है इन फ़ंक्शन को ओवरराइड किया जाना चाहिए।

कुछ googling के बाद मुझे php में "असली" आभासी कार्यों को लागू करने का एक अच्छा जवाब नहीं मिला (बस एक वर्चुअल फ़ंक्शन है, जो लगभग ठोस कार्यान्वयन की सभी आशाओं को मारता है)।

तो, आप इस मामले के साथ क्या करेंगे?

+0

मुझे खेद है, लेकिन जब आप कहते हैं कि "वर्चुअल फ़ंक्शंस" आप __call() और __callStatic() जादू विधियों के बारे में बात कर रहे हैं, तो मुझे आपका प्रश्न बिल्कुल समझ में नहीं आया? या लैम्ब्डा कार्यों? –

+5

मुझे लगता है कि वह विधि अधिभावी का मतलब है। http://en.wikipedia.org/wiki/Method_overriding जो C++ के रूप में आभासी कार्यों में संदर्भित किया जाता है। –

उत्तर

31

PHP में सभी सार्वजनिक और संरक्षित कार्यों "आभासी" कर रहे हैं। आप final कीवर्ड को प्रीपेड करके कार्यों को ओवरराइड होने से रोक सकते हैं। (या उन्हें निजी बनाकर, लेकिन यह शायद एक बुरा विचार है)।

बेसक्लास के डिज़ाइन में मैं उन व्यवहारों के बारे में सोचूंगा जो उप-वर्ग प्रभावित करना चाहते हैं। मैं उदाहरण के लिए पहले_update() और after_insert() जैसे खाली फ़ंक्शन बनाउंगा।

function after_insert() { 
    // Virtual 
} 

एक अद्यतन/डालने घटना तब होती है जब कौन सा baseclass कॉल करेंगे।

शायद एक is_valid() फ़ंक्शन जो बेसक्लास में हमेशा सत्य होता है, और टिप्पणी करने के लिए टिप्पणी करता है कि उपclass झूठी वापसी के परिणाम क्या हैं।

उम्मीद है कि इस आप कुछ प्रेरणा देना होगा।

0

आपकी बेस क्लास के कार्यान्वयन के उदाहरण के बिना, ठोस जानकारी देना मुश्किल है। लेकिन कुछ बातों का ध्यान करने के लिए आते हैं:

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

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

  3. बिंदु 2 के बाद: कुछ सामान्य कार्यान्वित तरीकों के साथ एक अमूर्त वर्ग रखने में क्या गड़बड़ है, और अपनी वेनिला कक्षा (आपकी बेस क्लास) और अन्य कक्षाओं को से से प्राप्त करने दें?

  4. आखिरकार, आपको केवल बेस क्लास को विस्तारित करने के लिए लागू होने वाले इंटरफ़ेस को लागू करना चाहिए?

3

यदि आप गलत तरीके से कक्षा का उपयोग कर रहे हैं तो कुछ वर्ग कार्यों को ओवरराइड होने से रोकने के लिए आप हमेशा "अंतिम" कीवर्ड का उपयोग कर सकते हैं।

यह मेरे लिए लग रहा है जैसे वे इसलिए तरीकों अधिभावी कुछ कार्यक्षमता प्राप्त करने में असमर्थ हैं। आप अपनी कक्षाओं के डिजाइन पर एक नज़र लेने के लिए आवश्यकता हो सकती है।

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