2011-06-05 18 views
7

मैं बहुत मेरी कक्षा चर के बहुत सारे निजी बनाने के लिए और "आवरण" कार्यों कि मिल बनाने के लिए इस्तेमाल कर रहा हूँ/उन्हें सेट:निजी चर का लाभ/नुकसान?

class Something{ 
    private $var; 

    function getVar(){ 
    $return $this->var; 
    } 

} 

$smth = new Something(); 
echo $smth->getVar(); 

मैं देख रहा हूँ बहुत से लोगों को यह करने के कि, तो मैं क्या कर समाप्त हो गया

class Something{ 
    public $var; 
} 
$smth = new Something(); 
echp $smth->var; 

: एक ही :)

वहाँ उन्हें इस तरह की तुलना में उपयोग कर किसी भी लाभ है?

मुझे लगता है कि है कि आप उन्हें सीधे कक्षा के बाहर तक नहीं पहुँच सकता निजी साधन जानते हैं, लेकिन मेरे लिए यह बहुत महत्वपूर्ण है, तो चर कहीं से भी पहुँचा जा सकता है प्रतीत नहीं होता ...

तो वहाँ किसी भी अन्य है छुपे हुए लाभ कि मैं निजी चर के साथ याद आ रही है?

+0

आप कुछ महीने पहले पूछे गए एक प्रश्न में अपना उत्तर पा सकते हैं जब मैं कक्षाओं के बारे में सीख रहा था: http://stackoverflow.com/questions/5034951/how-should-i-write-classes-c – Lockhead

उत्तर

3

यदि आप सार्वजनिक गेटर्स और सेटर्स के साथ निजी चर का उपयोग करना चाहते हैं या यदि आप सीधे एक चर को सार्वजनिक रूप से घोषित करना चाहते हैं तो यह मामला अलग है।

"गेटर्स" और "सेटर्स" का उपयोग करने के लिए यह अच्छा हो सकता है कि अगर कोई डेटा एक्सेस करने पर नियंत्रण रखना चाहता है।

उदाहरण के लिए, मान लीजिए कि आपने यह मिल गया:

public setBirthday($date) 

तो फिर तुम यह सुनिश्चित करें कि जो दिनांक सेटर के लिए में पारित एक वैध जन्मतिथि है बना सकते हैं।

लेकिन आप अगर आप सिर्फ चर सार्वजनिक रूप में इस

public $birthday; 

टिप्पणियों के आधार पर की तरह की घोषणा नहीं कर सकते हैं।

इसके अलावा, अगर आप 1/1/1970 से अब तक की नंबर करने के लिए तिथि से युक्त एक स्ट्रिंग से आंतरिक भंडारण तंत्र को बदलने का फैसला है, तो आप अभी भी तारीख बाह्य ही में पेश कर सकते हैं अगर आप encapsulation का उपयोग करते हैं, लेकिन यदि आप सीधे चर का पर्दाफाश करते हैं। कोड का प्रत्येक टुकड़ा जो आंतरिक वैरिएबल को सीधे स्पर्श करता है, अब सीधे टूट जाएगा।

इसका मतलब है कि यदि आंतरिक संग्रहण तंत्र 1/1/1970 से सेकंड की संख्या में बदल जाएगा तो आपको 'बाहरी API' को बदलने की आवश्यकता नहीं है।

public getBirthday() { 
    // you can still return a string formatted date, even though your 
    // private variable contains number of seconds from 1/1/1970 
} 
+0

इसके अलावा, यदि आप 1/1/1970 के बाद से सेकंड की संख्या तक की स्ट्रिंग से आंतरिक स्टोरेज तंत्र को बदलने का निर्णय लेते हैं, तो आप अभी भी उसी तरह से तारीख को वर्तमान में प्रस्तुत कर सकते हैं यदि आप encapsulation का उपयोग करते हैं, लेकिन यदि आप बेनकाब नहीं करते हैं चर सीधे। कोड के प्रत्येक टुकड़े जो आंतरिक चर को छुआ सीधे तोड़ दिया जाएगा। – tvanfosson

+0

अच्छा बिंदु! मैंने इसे समझाने के लिए अपना प्रश्न संपादित किया। – Fredrik

2

यह बाहरी परिवर्तन के लिए इच्छित चर से वर्ग के कार्यान्वयन के लिए आंतरिक चर को प्रदर्शित करना है। protected चर भी हैं, जो आंतरिक उपयोग के लिए हैं, और कक्षा में एक्सटेंशन द्वारा उपयोग करते हैं।

हम चर private चर बनाते हैं ताकि केवल कक्षा के भीतर कोड चर से संशोधित हो सके, बाहरी से हस्तक्षेप की रक्षा कर सके, नियंत्रण की गारंटी और चर के अपेक्षित व्यवहार।

4

इसे encapsulation कहा जाता है और यह एक बहुत अच्छी बात है। Encapsulation अन्य कक्षाओं से आपकी कक्षा को इसके आंतरिक के साथ मिलकर छेड़छाड़ करता है, उन्हें केवल आपके द्वारा उपयोग की जाने वाली पहुंच मिलती है। यह उन्हें उन परिवर्तनों से भी बचाता है जिन्हें आप कक्षा आंतरिक में कर सकते हैं। Encapsulation के बिना यदि आप किसी चर के नाम या उपयोग में परिवर्तन करते हैं, तो वह परिवर्तन वेरिएबल का उपयोग करने वाले सभी अन्य वर्गों में प्रचारित होता है। यदि आप उन्हें किसी विधि से गुजरने के लिए मजबूर करते हैं, तो कम से कम एक मौका है कि आप विधि में परिवर्तन को संभालने में सक्षम होंगे और अन्य वर्गों को परिवर्तन से सुरक्षित रखेंगे।

3

एक्सेस संशोधक स्क्रिप्टिंग भाषाओं में पूरी तरह से समझ नहीं लेते हैं। पाइथन या जावास्क्रिप्ट जैसी कई वास्तविक ऑब्जेक्ट-उन्मुख भाषाओं में उनके पास नहीं है।

और बेवकूफ गेटर/सेटर विधियों का प्रसार केवल PHP के कारण स्पष्ट निर्माण प्रदान नहीं कर रहा है। http://berryllium.nl/2011/02/getters-and-setters-evil-or-necessary-evil/

+2

वे जब उन्हें लागू किया जाता है, तो वे सही तरीके से समझते हैं, जैसा कि वे अन्य भाषाओं में करते हैं। – Orbling

+0

उनका अत्यधिक उपयोग अक्सर कोर ओओपी अवधारणाओं की गलतफहमी को इंगित करता है, जैसे संदेश और encapsulation के उद्देश्य। – mario

+0

@ मारियो: मैं असहमत हूं, सभी तत्काल चर के उन पर एक एक्सेस संशोधक होना चाहिए, यदि उनके अलावा कुछ और नहीं है तो उनके दायरे को ध्यान में रखें। – Orbling

2

कैप्सूलीकरण के प्रयोजन के अन्य वस्तुओं से एक वस्तु का आंतरिक को छिपाने के लिए है: कारण आप इसे पर पूरा नियंत्रण है क्योंकि है। विचार यह है कि ऑब्जेक्ट का बाहरी पदचिह्न इसके परिभाषित प्रकार का गठन करता है, इसे अन्य वस्तुओं के साथ अनुबंध की तरह सोचें। आंतरिक रूप से, बाहरी पक्ष की कार्यक्षमता प्रदान करने के लिए इसे कुछ हुप्स से कूदना पड़ सकता है, लेकिन यह अन्य वस्तुओं के लिए कोई चिंता नहीं है। वे इसके साथ गड़बड़ करने में सक्षम नहीं होना चाहिए।

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

आंतरिक रूप से, वह वर्ग गणना करने के लिए कुछ मान (किसी दिए गए क्षेत्राधिकार के लिए कर, उदाहरण के लिए) प्राप्त करने के लिए डेटाबेस को मार रहा है। यह डेटाबेस कनेक्शन और अन्य डेटाबेस से संबंधित चीजों को आंतरिक रूप से बनाए रख सकता है, लेकिन अन्य वर्गों को इसके बारे में जानने की आवश्यकता नहीं है। अन्य वर्ग केवल कार्यक्षमता के बाहर के अनुबंध के साथ चिंतित हैं।

मान लीजिए कुछ समय बाद डेटाबेस को बाहरी वेब सेवा के साथ प्रतिस्थापित करने की आवश्यकता है। (कंपनी आंतरिक रूप से बनाए रखने के बजाय बिक्री कर की गणना करने के लिए एक सेवा के साथ जा रही है।)। चूंकि कक्षा encapsulated है, आप डेटाबेस के बजाय सेवा का उपयोग करने के लिए अपने आंतरिक कार्यान्वयन को आसानी से बदल सकते हैं। कक्षा को केवल समान बाहरी पक्षपात प्रदान करने की आवश्यकता है।

यदि अन्य वर्ग कक्षा के आंतरिक भाग के साथ मिल रहे थे, तो इसे फिर से लागू करने से सिस्टम के अन्य हिस्सों को तोड़ने का खतरा होगा।

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