2010-12-22 13 views
31

के साथ PHP नेमस्पेस आश्चर्यजनक है कि PHP 5.3 का उपयोग करके कक्षाओं को नामस्थान करने की नई क्षमता का उपयोग करते समय किसी और को इस समस्या का सामना करना पड़ा है।डायनामिक क्लास नाम

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

मेरे पास उपयोगकर्ता के प्रकार के लिए वैश्विक स्कोप में परिभाषित नाम के साथ एक ऑब्जेक्ट मॉडल है, लेकिन मेरे पास संपादक नामस्थान में उपयोगकर्ता के संपादक के लिए एक ही नाम वाला एक और ऑब्जेक्ट है। किसी कारण से, PHP मुझे निम्नानुसार नामांकित गतिशील कॉल करने की अनुमति नहीं देगा।

$definition = Definer::defineProfile($_SESSION['user']->UserType); 
new \Editor\$definition(); 

समान वाक्य रचना ग्लोबल नेम स्पेस में वैश्विक बुनियादी ऑब्जेक्ट मॉडल फोन करने के लिए काम करता है और मैं इसे इस तरह से मज़बूती से उपयोग करें आवेदन भर।

$definition = Definer::defineProfile($_SESSION['user']->UserType); 
new $definition(); 

यह सही ढंग से गतिशील रूप से वांछित कक्षा को कॉल करेगा।

क्या कोई कारण अलग-अलग व्यवहार करेगा, या इस मनोरंजक में नामस्थानों के लिए गतिशील कॉलिंग लागू नहीं की गई है, क्योंकि यह एक नई सुविधा है? स्पष्ट रूप से कोड में अपना नाम रखने के बिना, लेकिन एक चर के भीतर किसी अन्य नामस्थान से कक्षा को गतिशील रूप से कॉल करने का कोई और तरीका है?

+0

मैं उस – yoda

उत्तर

64

ठीक है, बस स्ट्रिंग में नाम स्थान उल्लेख:

$definition = Definer::defineProfile($_SESSION['user']->UserType); 
$class = '\\Editor\\' . $definition; 
$foo = new $class(); 

और अगर यह एक बच्चे के नाम स्थान (टिप्पणी में संकेत के रूप में) है, बस __NAMESPACE__ साथ नाम स्थान पहले जोड़ें:

$class = __NAMESPACE__ . '\\Editor\\' . $definition; 

तो यदि वर्तमान नामस्थान \Foo\Bar है, और $definition "बाज़" है, परिणामी वर्ग \Foo\Bar\Editor\Baz

+3

के लिए eval() का उपयोग करता हूं पूरी तरह से काम किया। मुझे स्ट्रिंग में बस जोड़ने की सोचने के लिए महाकाव्य विफल हो गया है। धन्यवाद! – DeaconDesperado

+0

कोई समस्या नहीं है (मैंने पहले एक ही समस्या को मारा है) ... – ircmaxell

+0

या बेहतर पठनीयता के लिए '\\' से बचें नहीं। IMHO। एलओएल मार्कडाउन सिर्फ बैकस्लैश के लिए काम नहीं करता है: '\' या एक बच निकला बैकस्लैश: '\\' (वाह अब यह बहुत गलत है!) – Rudie

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