मेरे पास कक्षाओं का एक समूह है जो एक अमूर्त वर्ग का विस्तार करता है। अमूर्त वर्ग में ऐसे विधियां हैं जो बाल कक्षाओं में परिभाषित जानकारी प्राप्त करने के लिए देर से स्थिर बाइंडिंग का उपयोग करती हैं। उदाहरण के लिए, अमूर्त वर्ग एक विधि लाइन युक्त हो सकता है:PHP - एक वर्ग को संपत्ति घोषित करने के लिए मजबूर करें
$var = static::$childVar . ' some text';
इस तरह, यह विधि अमूर्त वर्ग में परिभाषित एक चर के मूल्य के आधार पर विभिन्न तार उत्पन्न करने के लिए के लिए कार्यावधि में संभव है बाल वर्गों में परिभाषित किया गया।
मैं क्या करना चाहता हूं कुछ ऐसा तंत्र है जो बच्चे वर्गों को इस चर घोषित करने के लिए मजबूर करता है, अगर चर सेट नहीं किया जाता है तो विधि की संभावना को समाप्त कर दिया जाता है।
इंटरफेस का उपयोग करना, विधियों को परिभाषित करने के लिए कक्षा की आवश्यकता होती है (और स्थिरांक, दुर्भाग्य से सार्वजनिक/संरक्षित/निजी का उपयोग करके उनकी दृश्यता में संशोधन नहीं हो सकता है)। तो यदि कोई वर्ग इंटरफ़ेस लागू करता है, लेकिन इंटरफ़ेस में निर्दिष्ट सभी विधियों को परिभाषित नहीं करता है, तो एक त्रुटि उत्पन्न होती है। हालांकि, किसी संपत्ति को परिभाषित करने के लिए कक्षा की आवश्यकता के लिए इंटरफ़ेस का उपयोग करने का कोई तरीका नहीं है।
मैंने कुछ सामग्री देखी है जो इंटरफ़ेस में गेटर विधियों का उपयोग करने का सुझाव देती है (उदाहरण के लिए getChildVar()) को स्पष्ट रूप से परिवर्तनीय घोषणा की आवश्यकता है, लेकिन यह मेरे लिए उपयुक्त नहीं है क्योंकि मैं नहीं चाहता कि वेरिएबल कक्षा के बाहर पहुंच योग्य हों (उनके पास protected
दृश्यता है)।
इसी प्रकार, स्थिरांक काम नहीं करेंगे, क्योंकि वे protected
दृश्यता संशोधक का समर्थन नहीं करते हैं।
मैं जानता हूँ कि मैं हमेशा अमूर्त वर्ग की विधि (या यहां तक कि निर्माता में) में इस के लिए जाँच करने के लिए एक isset()
बयान इस्तेमाल कर सकते हैं, लेकिन यह सुनिश्चित करने के तरीकों परिभाषित कर रहे हैं के लिए इंटरफेस के उपयोग की तुलना में असजीला लगता है। मैं सोच रहा हूं कि मेरे अमूर्त वर्ग में आवश्यकताओं को हार्डकोड किए बिना ऐसा करने का कुछ मानक तरीका है या नहीं।
संयोग से, अगर कोई जानता है कि आप इंटरफेस के अंदर चर क्यों घोषित नहीं कर सकते हैं, तो मुझे यह जानने में दिलचस्पी होगी कि तर्क क्या है। यह मेरे लिए एक बड़ी निगरानी की तरह लगता है।
किसी भी मदद की बहुत सराहना की जाएगी।
इस स्पष्टीकरण के लिए धन्यवाद। मैं अब समझता हूं कि क्यों इंटरफेस परिवर्तनीय घोषणा की अनुमति नहीं देते हैं (हालांकि मुझे यकीन नहीं है कि मैं उस निर्णय के पीछे तर्क के साथ पूरी तरह से सहमत हूं)। और मैं वास्तव में लगभग उसी कोड के साथ आया था जैसा आपके पास है, इसलिए यह जानना अच्छा है कि मैं इसे सही कर रहा हूं। – C106