PHP में गैर-अमूर्त वर्ग में सार पद्धति कैसे घोषित करें?




abstract-function (5)

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

class absclass {
    abstract public function fuc();
}

रिपोर्ट:

PHP घातक त्रुटि: क्लास एब्सक्लास में 1 सार विधि होती है और इसलिए उसे सार घोषित किया जाना चाहिए या शेष विधियों को लागू करना चाहिए (absclass ::uc)

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


इसका अर्थ है कि एक अमूर्त वर्ग का उचित कम से कम एक सार पद्धति है। इसलिए आपकी कक्षा को या तो विधि (गैर सार) को लागू करना है, या सार घोषित करना है।


एब्स्ट्रैक्ट कीवर्ड का इस्तेमाल क्लास या तरीकों को पैटर्न के रूप में लेबल करने के लिए किया जाता है। यह इंटरफेस के समान है लेकिन इसमें चर और विधियों का कार्यान्वयन हो सकता है।

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

डॉग क्लास द्वारा अमूर्त घोषित किए जाने वाले सभी तरीकों को डॉग का विस्तार करने वाले प्रत्येक वर्ग में मैन्युअल रूप से लागू किया जाना चाहिए।

उदाहरण के लिए, अमूर्त वर्ग डॉग में एक अमूर्त विधि है डॉग :: बार्क ()। लेकिन सभी कुत्ते अलग तरह से भौंकते हैं। इसलिए प्रत्येक डॉग-उपवर्गों में आपको एचओडब्ल्यू का वर्णन करना चाहिए कि कुत्ते भौंकते हैं, इसलिए आपको उदाहरण देना चाहिए जैसे स्मार्टडॉग :: बार्क ()।


मुझे लगता है कि शेष विधियां वास्तव में उन अमूर्त तरीकों को संदर्भित करती हैं जिन्हें आप परिभाषित करने की कोशिश कर रहे हैं (इस मामले में, fuc() ), क्योंकि गैर-अमूर्त तरीके जो मौजूद हो सकते हैं वैसे भी ठीक हैं। यह शायद एक त्रुटि संदेश है जो एक बेहतर शब्द का उपयोग कर सकता है: जहां यह शेष कहता है उसे सार कहना चाहिए।

फिक्स बहुत सीधा है (त्रुटि संदेश का वह भाग ठीक है): आपको इसे बदलने की आवश्यकता है:

abstract public function fuc();

... एक उचित कार्यान्वयन में:

public function fuc(){
    // Code comes here
}

... या, वैकल्पिक रूप से और अपनी आवश्यकताओं के आधार पर, पूरे वर्ग को सारगर्भित बनाएँ:

abstract class absclass {
    abstract public function fuc();
}

PHP मैनुअल में क्लास एब्स्ट्रेक्शन पर अध्याय देखें:

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

इसका मतलब आपको या तो करना है

abstract class absclass { // mark the entire class as abstract
    abstract public function fuc();
}

या

class absclass {
    public function fuc() { // implement the method body
        // which means it won't be abstract anymore
    };
}




abstract-function