निम्नलिखित कोड में PHP को नाखुश होगा कि customMethod() निजी है। यह एक केस क्यों है? क्या दृश्यता निर्धारित की गई है कि परिभाषित करने के बजाए कुछ कहां घोषित किया गया है?सार निजी कार्यों
यदि मैं कस्टममैट को केवल टेम्पलेट क्लास में बॉयलरप्लेट कोड के लिए दृश्यमान बनाना चाहता हूं और इसे अतिरंजित होने से रोकता हूं, तो क्या मैं वैकल्पिक रूप से इसे संरक्षित और अंतिम बना दूंगा?
template.php:
abstract class Template() {
abstract private function customMethod();
public function commonMethod() {
$this->customMethod();
}
}
CustomA.php:
class CustomA extends Template {
private function customMethod() {
blah...
}
}
main.php
...
$object = new CustomA();
$object->commonMethod();
..
यह सी ++ (और मुझे लगता है कि जावा) व्यवहार से अलग है। सी ++ शुद्ध वर्चुअल फ़ंक्शन (सार तत्वों के बराबर) को निजी होने की अनुमति देता है। यह अच्छा है क्योंकि यह व्युत्पन्न वर्ग को निर्दिष्ट करने और नियंत्रित करने की अनुमति देता है कि क्या करना है, जबकि यह लागू करना कि केवल बेस क्लास इसे चुनने के लिए चुन सकता है। संरक्षित अमूर्त कार्य आपको वही गारंटी नहीं दे सकते क्योंकि व्युत्पन्न वर्ग स्वतंत्र रूप से एक सार्वजनिक कार्य बना सकता है जो संरक्षित कार्यान्वयन को कॉल करता है और encapsulation को तोड़ देता है। – Aaron
आसपास कार्य करें: आप सारणी कक्षा परिभाषा में संरक्षित फ़ंक्शन में 'अंतिम' कीवर्ड जोड़ सकते हैं (यानी अंतिम संरक्षित फ़ंक्शन my_function() ')। यह कार्य को बाल वर्गों द्वारा ओवरराइड होने से रोक देगा, हालांकि बाल वर्ग स्वयं के लिए फ़ंक्शन को कॉल कर सकता है (ऐसा कुछ जो माता-पिता के निजी फ़ंक्शन के साथ नहीं हो सकता है)। यह एक अमूर्त वर्ग को परिभाषित करने के उद्देश्य को हराता है या नहीं, यह एक और दिन के लिए दार्शनिक चर्चा है। (वैकल्पिक रूप से, आप एक नई कक्षा को परिभाषित कर सकते हैं जो अमूर्त वर्ग को विस्तारित करता है और कार्य को निजी रूप से परिभाषित करता है।) – Slicktrick