2011-03-22 14 views
6

मैं निम्न स्कीमाकन्स्ट्रक्टर के बाद कक्षा स्थिरांक सेट करना?

class MyClass 
{ 
    const x = 'abc'; 
    const y = '123'; 

    function _contruct() {} 
} 

मेरे लिए किसी भी तरह से करने के लिए स्थिरांक वर्ग शरीर में सेट किए बिना रहते हैं, और गतिशील रूप से सेट किया जा के बाद निर्माता बुलाया गया है है के साथ एक वर्ग है? इस तरह उदा कुछ:

class MyClass 
{ 
    const x; 
    const y; 

    function _contruct() 
    { 
     $this->setStuff(); 
    } 

    function setStuff() 
    { 
    $this->x = Config::getX(); 
    $this->y = Config::getY(); 
    } 
} 
+1

बस उत्सुक, आप यहां क्या करने की कोशिश कर रहे हैं? –

+0

@ क्लार्क को अभी क्लार्क बॉडी में हार्ड कोड कोड करने के लिए कुछ कॉन्फ़िगरेशन मानों की आवश्यकता है, मैं इसे बदलने की कोशिश कर रहा हूं ताकि उन्हें कक्षा –

+1

में बाद में कॉन्फ़िगर क्लास से लाया जा सके, फिर उन्हें स्थिरांक बनाने के लिए व्यर्थ लगता है। –

उत्तर

6

नाम पता चलता है, कि मूल्य (http://php.net/manual/en/language.constants.php)

तो (जादू स्थिरांक है, जो वास्तव में स्थिरांक नहीं हैं को छोड़कर) स्क्रिप्ट के निष्पादन के दौरान नहीं बदल सकते, नहीं। आप उन्हें निजी युद्ध कर सकते हैं।

4

सं क्लास स्थिरांक (और वैश्विक या नाम स्थान स्थिरांक const कीवर्ड के साथ परिभाषित) शाब्दिक मान होना है और रनटाइम करने से पहले स्थापित होना चाहिये। यही वह जगह है जहां वे पुराने स्कूल define() स्थिरांक से अलग होते हैं जो रनटाइम पर सेट होते हैं। किसी स्क्रिप्ट के निष्पादन के दौरान const निरंतर बदलना या सेट करना संभव नहीं है।

मूल्य स्थिर अभिव्यक्ति, नहीं (उदाहरण के लिए) एक चर, एक संपत्ति, एक गणितीय क्रिया के फलस्वरूप, या एक समारोह कॉल किया जाना चाहिए।

पीएचपी पुस्तिका से

: Class Constants

तो संभव है कि:

define('MY_CONST', someFunctionThatReturnsAValue()); 

लेकिन वह नहीं है:

const MY_CONST = someFunctionThatReturnsAValue(); 

// or 

class MyClass { 
    const MY_CONST = = someFunctionThatReturnsAValue(); 
} 

// or 

namespace MyNamespace; 
const MY_CONST = someFunctionThatReturnsAValue(); 

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

+0

पुरानी स्कूल परिभाषित बयान के साथ समस्या यह है कि वे दायरे में सीमित नहीं हैं। यह उपयोगी होगा अगर उन्होंने सी ++ से एक क्यू लिया, और रनटाइम पर कार्यक्षमता को आवंटित करने की अनुमति दी। इस तरह, यदि हम बाद में सत्यापन (जैसे उपयोगकर्ता आईडी) के लिए कुछ डेटा सहेजना चाहते हैं, तो हम इसे अभी भी रन टाइम (कहें, $ _SESSION चर से) घोषित कर सकते हैं, इसे कक्षा में प्रतिबंधित कर सकते हैं और इसे अपरिवर्तनीय बना सकते हैं। हालांकि, बहुत अच्छी व्याख्या है। धन्यवाद दोस्तों! – Atomox

1

कॉन्स्टेंट "स्थिर" है। आप इसे बदल नहीं सकते।

आप इसके लिए चर का उपयोग कर सकते हैं।

1

असंभव। यदि आप setStuff() में x और y सेट कर सकते हैं, तो आप उन्हें किसी अन्य विधि में भी सेट कर सकते हैं। प्रति परिभाषा एक निरंतर बदल नहीं सकता है। इसलिए आपका एक्स और वाई चर होगा, स्थिरांक नहीं।

3

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

class MyClass 
{ 
    private $x; 
    private $y; 
    public function __construct($x, $y) 
    { 
     $this->x = $x; 
     $this->y = $y; 
    } 
} 

जब तक अपनी कक्षा does not किसी भी तरीकों का पर्दाफाश $x और $y संशोधित करने के लिए और आप उन्हें आंतरिक रूप chaning नहीं कर रहे हैं के रूप में, वे प्रभावी लगातार कर रहे हैं।गैर-सार्वजनिक चर के साथ आप एकमात्र चीज नहीं कर सकते हैं, तो MyClass::X है, लेकिन मेरी राय है कि आपको कक्षाओं के स्थिरांक का उपयोग अपने संबंधित वर्गों के बाहर किसी भी तरह से नहीं करना चाहिए क्योंकि यह उपभोक्ता और कक्षा के बीच युग्मन शुरू करता है।

उतना सरल।

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