2010-11-28 12 views
8

यहां वह कोड है जो काम नहीं करेगा:PHP में कक्षा विशेषता में कक्षा निरंतर उपयोग कैसे करें?

class MyClass 
{ 
    const myconst = 'somevalue'; 

    private $myvar = array(0 => 'do something with '.self::myconst); 
} 

लगता है कि कक्षा स्थिरांक "संकलन समय" पर उपलब्ध नहीं हैं, लेकिन केवल रनटाइम पर उपलब्ध हैं। क्या किसी को कोई कामकाज पता है? (परिभाषित काम नहीं करेगा)

धन्यवाद

+0

यदि आप सी मैक्रो की तरह कुछ ढूंढ रहे हैं, तो PHP इस तरह से काम नहीं करता है। इसके अलावा, कोई "संकलन समय" नहीं है। PHP एक दुभाषिया है। – stillstanding

+0

मैनुअल लिखने वाले लोग इस धारणा के तहत प्रतीत होते हैं कि "संकलन समय" है। http://www.php.net/manual/en/language.oop5.properties.php –

+0

एक "संकलन समय" (प्रकार का) है, क्योंकि PHP आंतरिक टेक्स्ट कोड को बाइटकोड में परिवर्तित करते हैं। Http://sebastian-bergmann.de/archives/868-PHP-Compiler-Internals.html – Antoine

उत्तर

10

समस्या यह है कि आप एक निरंतर प्रयोग कर रहे हैं, लेकिन आप एक अभिव्यक्ति का उपयोग कर रहे है कि नहीं है।

कक्षा सदस्य चर को "गुण" कहा जाता है। (...) वे एक सामान्य परिवर्तनीय घोषणा के बाद सार्वजनिक, संरक्षित, या निजी कीवर्ड में से किसी एक का उपयोग करके परिभाषित किए जाते हैं। इस घोषणा में प्रारंभिकरण, शामिल हो सकता है लेकिन यह प्रारंभिक निरंतर मान होना चाहिए - यह है कि इसे संकलित समय पर मूल्यांकन करने में सक्षम होना चाहिए और मूल्यांकन के लिए रन-टाइम जानकारी पर निर्भर नहीं होना चाहिए।

यह सरल घोषणा, उदाहरण के लिए, संकलन नहीं होगा (पार्स त्रुटि):

class MyClass{ 
    private $myvar = 3+2; 
} 

लेकिन अगर हम नहीं बल्कि एक स्ट्रिंग है निरंतर कहीं भी होगी साथ concatenated से, सरल निरंतर उपयोग करने के लिए अपनी कक्षा घोषणा बदल उम्मीद के रूप में काम करते हैं।

class MyClass{ 
    const myconst = 'somevalue'; 
    public $myvar = array(0 => self::myconst); 
} 

$obj = new MyClass(); 
echo $obj->myvar[0]; 

के रूप में एक काम के आसपास आप निर्माता में अपने गुण को प्रारंभ कर सकते हैं:,
एलिन

class MyClass{ 
    const myconst = 'somevalue'; 
    public $myvar; 

    public function __construct(){ 
     $this->myvar = array(0 => 'do something with '.self::myconst); 
    } 
} 
$obj = new MyClass(); 
echo $obj->myvar[0]; 

मुझे आशा है कि इस मदद करता है

+0

हां मुझे पता था कि ... मैंने पहली बार अपनी सरणी "कॉन्स्ट" करने की कोशिश की, लेकिन PHP इसे अनुमति नहीं देता है। और ऐसा लगता है कि बुनियादी "परिभाषित" (वास्तविक एक, सी/सी ++ से # परिभाषा) PHP में मौजूद नहीं है। तो, किसी के पास कामकाज है? – Antoine

+0

@Antoine नवीनतम संपादन देखें। यह सब मैं सोच सकता हूं और मैं कहूंगा कि यह कन्स्ट्रक्टर में आरंभ करने के लिए एक स्वीकार्य तरीका है। –

+0

धन्यवाद, यह मेरी समस्या का समाधान करने का एक अच्छा तरीका है! – Antoine

0

ध्यान दें कि PHP के लिए 5.6 और ऊपर , ऐसा करना संभव है।

https://secure.php.net/manual/en/migration56.new-features.php देखें:

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

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