2009-07-06 20 views
39

मैं ओओपी प्रतिमान के लिए नया हूं, इसलिए शायद इस प्रश्न के लिए एक सरल स्पष्टीकरण है ...मुझे PHP कक्षा में चर कब घोषित करना चाहिए?

क्या आपको हमेशा कक्षा में सार्वजनिक ऑब्जेक्ट-व्यापी चर घोषित करने की आवश्यकता है? उदाहरण के लिए:

<?php 

class TestClass 
{ 
    var $declaredVar; 

    function __construct() 
    { 
     $this->declaredVar = "I am a declared variable."; 
     $this->undeclaredVar = "I wasn't declared, but I still work."; 
    } 

    function display() 
    { 
     echo $this->declaredVar . "<br />"; 
     echo $this->undeclaredVar; 
     echo "<br /><br />"; 
    } 
} 

$test = new TestClass; 
$test->display(); 

$test->declaredVar = "The declared variable was changed."; 
$test->undeclaredVar = "The undeclared variable was changed."; 

$test->display(); 

?> 

इस कोड में, भले ही $declaredVar केवल घोषित चर रहा है, $undeclaredVar बस के रूप में सुलभ और उपयोगी है - यह कार्य करने के लिए के रूप में अगर मैं इसे सार्वजनिक रूप में घोषित किया था लगता है।

यदि अविकसित वर्ग चर हमेशा इस तरह पहुंच योग्य होते हैं, तो उन्हें सभी को सामने घोषित करने का क्या मतलब है?

उत्तर

35

चर अप्रारंभीकृत नहीं है यही कारण है कि सेट कर सकते हैं, यह सिर्फ अघोषित है।

कक्षा परिभाषा में चर घोषित करना पठनीयता के लिए शैली का एक बिंदु है। प्लस आप एक्सेसिबिलिटी (निजी या सार्वजनिक) सेट कर सकते हैं।

वैसे भी, घोषित करने वाले चर स्पष्ट रूप से ओओपी के साथ कुछ लेना देना नहीं है, यह प्रोग्रामिंग-भाषा-विशिष्ट है। जावा में आप ऐसा नहीं कर सकते क्योंकि चर को स्पष्ट रूप से घोषित किया जाना चाहिए।

+2

तो ऐसा इसलिए है क्योंकि PHP वास्तव में क्षमा कर रहा है कि अविकसित चर काम करते हैं, है ना? – Andrew

+1

दाएं। हालांकि PHP को चेतावनी उत्सर्जित करनी चाहिए ... जगह त्रुटि_ रिपोर्टिंग (E_ALL); आपकी फाइल के शीर्ष पर। – Stephan202

+0

इतना अपने 2 वाक्य @klez व्याख्या की जा रही –

1

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

13

आप वर्ग के भीतर एक सदस्य घोषित यदि आप अपनी पहुंच, उदा,

private $varname; 
+5

एनबी: यह केवल PHP 5 के बाद से समर्थित है (बस अगर आप 4.x पेड़ पर फंस गए हैं), लेकिन मैं सहमत हूं कि स्पष्ट रूप से दोनों चर और विधि दृश्यता को सेट करना अच्छा अभ्यास है - सिर्फ इसलिए कि PHP दुभाषिया की आवश्यकता नहीं है इसका मतलब यह नहीं है कि आपको इसका उपयोग नहीं करना चाहिए। –

0

सामान्य चर में जैसे ही आपके पास उचित तरीके से करने के लिए पर्याप्त जानकारी होनी चाहिए।

यदि किसी वर्ग परिवर्तक को कुछ जानकारी की समझदारी से प्रारंभ करने की आवश्यकता होती है तो वह जानकारी निर्माता को पास की जानी चाहिए।

परिभाषा के बिंदु पर स्पष्ट रूप से घोषित करने के लिए PHP के वाक्यविन्यास का उपयोग करना, आईएमएचओ बग को पेश करने का एक निश्चित तरीका है - यदि आपकी कक्षा को एक चर की आवश्यकता है तो उसे घोषित करें, और ओओपी आपको छिपाने वाली सभी जानकारी का उपयोग करें।

9

आपको हमेशा अपने सदस्य चर घोषित करना चाहिए और अपनी कक्षाओं में उनकी पहुंच निर्दिष्ट करना चाहिए। मैं अपने कार्यों के बाद कक्षा के अंत में यह जानकारी रखना चाहता हूं।

जैसे ही आपके पास ऐसा करने के लिए पर्याप्त जानकारी हो, आपको उन्हें परिभाषित करना चाहिए। शायद कन्स्ट्रक्टर में या सेटर कार्यों के माध्यम से।

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

+0

"आपको उन्हें जल्द से जल्द परिभाषित करना चाहिए जैसे आपके पास ऐसा करने के लिए पर्याप्त जानकारी है।" क्या इससे कोई फर्क पड़ता है कि यह कन्स्ट्रक्टर या कन्स्ट्रक्टर में या सेटर फक्शन में है? – tehlivi

0

फेडेरिको कुल्लोका ने कहा, "वह चर अनियमित नहीं है, यह सिर्फ अव्यवस्थित है"। इसके अलावा आपने उनके लिए किसी भी एक्सेस संशोधक को परिभाषित नहीं किया है ताकि वे उन पर लागू सार्वजनिक संशोधक की तरह व्यवहार कर सकें।

आप पहले से ही जानते हैं। PHP एक ढीली टाइप की गई भाषा है।लेकिन एक प्रोग्रामर हमेशा सर्वोत्तम प्रथाओं का पालन करना चाहिए (लेकिन PHP में आदिम डेटा प्रकारों का उपयोग नहीं करना चाहिए)।

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

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