2012-07-14 14 views
6

उदाहरण काम नहीं करता:प्रवेश वर्ग लगातार गर्त संपत्ति

class LOL{ 
    const 
    FOO = 1; 
} 

$x = new LOL; 
$arr = array('x' => $x); 

echo $x::FOO; // works 
echo $arr['x']::FOO; // works too 

लेकिन अगर मैं मेरी कक्षा उदाहरण एक संपत्ति बनाने के लिए, मैं अब और निरंतर उपयोग नहीं कर सकते:

class WWW{ 
    protected $lol; 

    public function __construct($lol){ 
    $this->lol= $lol;  
    } 

    public function doSMth(){ 
    echo $this->lol::FOO; // fail. parse error.. wtf 
    } 
} 

$w = new WWW; 
$w->doSMth(); 

:(

मुझे पता है कि मैं सिर्फ echo LOL::FOO कर सकता हूं, लेकिन क्या होगा यदि कक्षा का नाम अज्ञात है? उस स्थिति से मुझे केवल उस वस्तु/संपत्ति तक पहुंच है, और मैं वास्तव में नहीं चाहता कि डब्ल्यूडब्ल्यूडब्ल्यू वर्ग ओटी के "जागरूक" हो उसकी कक्षाएं और उनके नाम। यह केवल दिए गए ऑब्जेक्ट

+0

इस $ w = नया WWW (नया एलओएल) आज़माएं; ? – Gntem

+0

लेकिन अगर वर्ग का नाम ज्ञात नहीं है, तो आप कैसे जान सकते हैं कि इसके साथ शुरू करने के लिए 'कॉन्स फूड' है? (जब तक कि आपके सभी वर्ग कुछ इंटरफ़ेस को कार्यान्वित नहीं कर रहे हों या कुछ वर्ग को विस्तारित कर रहे हों) –

+0

क्योंकि यह अपेक्षा करता है कि स्थिर होना मौजूद है: पी – Alex

उत्तर

1

के साथ काम करना चाहिए यदि कक्षा का नाम ज्ञात नहीं है, तो आप निरंतर प्राप्त करने के लिए ReflectionClass का उपयोग कर सकते हैं। ध्यान दें कि आपको PHP 5 या अधिक का उपयोग करना होगा।

उदाहरण:

$c = new ReflectionClass($this->lol); 
echo $c->getConstant('FOO'); // 1 

पीएचपी 5.3.0 के रूप में, आप लगातार एक चर वर्ग के नाम से युक्त के माध्यम से पहुँच सकते हैं:

$name = get_class($this->lol); 
echo $name::FOO; // 1 

अधिक जानकारी के लिए, देखें Scope Resolution Operator - PHP

2

आप स्थानीय चर में lol संपत्ति असाइन करके इसे इतना आसान कर सकते हैं, जैसे:

public function doSMth(){ 
    $lol = $this->lol; 
    echo $lol::FOO; 
} 

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

0
$lol = &$this->lol; 
echo $lol::FOO; 
.. 
unset($lol); 
+1

एसओ में आपका स्वागत है। जब आप कोई जवाब जोड़ते हैं तो संक्षिप्त विवरण जोड़ना प्रथागत होता है। –

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