2011-10-29 9 views
22

निम्नलिखित कोड में 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(); 
.. 

उत्तर

41

सार विधियां निजी नहीं हो सकती हैं, क्योंकि परिभाषा के अनुसार उन्हें एक व्युत्पन्न कक्षा द्वारा लागू किया जाना चाहिए। यदि आप यह नहीं चाहते हैं कि यह public हो, तो इसे protected होना चाहिए, जिसका अर्थ यह है कि इसे व्युत्पन्न कक्षाओं द्वारा देखा जा सकता है, लेकिन कोई और नहीं।

The PHP manual on abstract classes आपको इस तरह से protected का उपयोग करने के उदाहरण दिखाता है।

+9

यह सी ++ (और मुझे लगता है कि जावा) व्यवहार से अलग है। सी ++ शुद्ध वर्चुअल फ़ंक्शन (सार तत्वों के बराबर) को निजी होने की अनुमति देता है। यह अच्छा है क्योंकि यह व्युत्पन्न वर्ग को निर्दिष्ट करने और नियंत्रित करने की अनुमति देता है कि क्या करना है, जबकि यह लागू करना कि केवल बेस क्लास इसे चुनने के लिए चुन सकता है। संरक्षित अमूर्त कार्य आपको वही गारंटी नहीं दे सकते क्योंकि व्युत्पन्न वर्ग स्वतंत्र रूप से एक सार्वजनिक कार्य बना सकता है जो संरक्षित कार्यान्वयन को कॉल करता है और encapsulation को तोड़ देता है। – Aaron

+0

आसपास कार्य करें: आप सारणी कक्षा परिभाषा में संरक्षित फ़ंक्शन में 'अंतिम' कीवर्ड जोड़ सकते हैं (यानी अंतिम संरक्षित फ़ंक्शन my_function() ')। यह कार्य को बाल वर्गों द्वारा ओवरराइड होने से रोक देगा, हालांकि बाल वर्ग स्वयं के लिए फ़ंक्शन को कॉल कर सकता है (ऐसा कुछ जो माता-पिता के निजी फ़ंक्शन के साथ नहीं हो सकता है)। यह एक अमूर्त वर्ग को परिभाषित करने के उद्देश्य को हराता है या नहीं, यह एक और दिन के लिए दार्शनिक चर्चा है। (वैकल्पिक रूप से, आप एक नई कक्षा को परिभाषित कर सकते हैं जो अमूर्त वर्ग को विस्तारित करता है और कार्य को निजी रूप से परिभाषित करता है।) – Slicktrick

1

सार विधि के सार्वजनिक या संरक्षित कर रहे हैं। यह आवश्यक है।

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