2011-12-16 12 views
5

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

मैंने get_declared_classes() पर कॉल करने का प्रयास किया है, लेकिन किसी भी कारण से, मेरे द्वारा उपलब्ध कक्षाएं दिखाई नहीं दे रही हैं। मैं get_declared_classes() पर कॉल कर सकता हूं, सूची में Event नहीं देखता, फिर बिना किसी समस्या के $x = new Event() पर कॉल करें। निम्नलिखित की तरह कुछ, जो मुझे लगता है कि एक समस्या का कारण बनना चाहिए ...

if (! in_array('Event', get_declared_classes())) { $x = new Event(); } 

... ठीक काम करता है। मैं सोच रहा हूं कि इन वर्गों को नामित करने और उस तरह से पुनर्प्राप्त करने से समस्या को कम करने में मदद मिलेगी। क्या यह संभव है?

संपादित करें: स्पष्टीकरण के लिए, मुझे यह जोड़ने दें कि मैं वर्तमान में नामस्थान का उपयोग नहीं कर रहा हूं, और मैं विशेष रूप से उपर्युक्त सूचीबद्ध कोड से कुछ प्राप्त करने की कोशिश नहीं कर रहा हूं। मैं जो चाहता हूं वह सभी वर्गों के नाम प्राप्त करना है जिन्हें मैंने घोषित किया है। इस तथ्य के बावजूद कि get_declared_classes() पर कॉल करने से पहले उन सभी के लिए कक्षा घोषणाएं प्रभावित की जा रही हैं, वे सभी सूची में शामिल नहीं हो रहे हैं। मैं उम्मीद कर रहा था कि नामस्थान समस्या को हल करने में मदद कर सकता है।

EDIT2: कई लोगों ने इंगित किया है कि कक्षाएं ऑटोलोड हो सकती हैं। मैंने निम्नलिखित करके इसका परीक्षण किया। echo(class_exists('Event')) ने 1 का एक मूल्य वापस कर दिया। echo(class_exists('Event', FALSE)) ने 0 का मान वापस कर दिया। दूसरा, class_exists के लिए वैकल्पिक पैरामीटर यह है कि स्वत: लोड करना है या नहीं। तो, स्पष्ट रूप से कक्षा को स्वत: लोड किया जा रहा है। वह जवाब देता है।

तो, अगला प्रश्न - मैं इसे कैसे रोकूं? मैं एक ढांचे का उपयोग कर रहा हूं जो वास्तव में मुझे बहुत कम स्तर का नियंत्रण नहीं देता है। क्या स्वत: लोडिंग को मजबूर करने का कोई तरीका है, फिर get_declared_classes पर कॉल करें, या get_declared_classes पर पहले ऑटोलोड लोड करने के लिए?

+1

इस परिदृश्य में get_declared_classes में ईवेंट नहीं है, क्या इवेंट कोड लोड किया गया है? दूसरे शब्दों में, क्या फ़ाइल में इवेंट की कक्षा घोषणा शामिल है (या अन्यथा कोड के प्रवाह में परिभाषित किया गया है)? – Corbin

+1

मुझे परीक्षण करने के लिए परेशान किया गया है, लेकिन मुझे लगता है कि ऐसा इसलिए हो सकता है क्योंकि आपने एक उपयोग कथन के साथ एक एनएस का संदर्भ दिया है और सरणी में वर्ग का नाम नामस्थान के साथ पूरी तरह से योग्यता प्राप्त करने वाला है। ताकि जब 'नया इवेंट' वास्तव में '\ कुछ \ अन्य नामस्थान \ ईवेंट' का संदर्भ दे रहा हो। – prodigitalson

+0

@ कॉरबिन इवेंट कोड निश्चित रूप से लोड किया गया है। यदि नहीं, तो 'x x = नया इवेंट() 'असफल हो जाएगा, है ना? – rybosome

उत्तर

5

आप कोड में कठिन कोड यह की जरूरत नहीं है, आप चर नाम का उपयोग कर सकते हैं: codepad.org/hCLE4ToA:

$class_name = 'Event'; 
if (!in_array($class_name, get_declared_classes())) { 
    $x = new $class_name(); 
}; 

यहाँ कार्रवाई में समान कोड देखें।

कुछ कक्षाएं get_declared_classes() के परिणाम में दिखाई नहीं दे सकती हैं, क्योंकि इस समारोह को कॉल करने के समय उन्हें लोड नहीं किया जा सकता है। यह मामला हो सकता है यदि वे ऑटोलोडेड हैं तो आप उन्हें तुरंत चालू करने का प्रयास करें। यहां ऑटोलोडिंग कक्षाओं पर और देखें: php.net/autoload

क्या यह आपके कुछ प्रश्नों का उत्तर देता है? क्या इससे मदद मिली?

+0

मैं वास्तव में सूचीबद्ध उदाहरण को करने की कोशिश नहीं कर रहा हूं।यह अधिक प्रदर्शनकारी था कि मैं जिस वर्ग का नाम चाहता हूं वह सूची में दिखाई नहीं दे रहा है जैसा कि मैं उम्मीद करता हूं, फिर भी यह तत्कालता के लिए उपलब्ध है। – rybosome

+1

@Ryan: क्या आप सुनिश्चित हैं कि यह तत्कालता के लिए उपलब्ध नहीं है क्योंकि जब आप इसे तुरंत चालू करने का प्रयास करते हैं तो यह स्वत: लोड हो जाता है? दूसरे शब्दों में: क्या आपको यकीन है कि 'get_declared_classes()' कहलाए जाने से पहले कक्षा को परिभाषित किया गया है? – Tadeck

+0

आप सही थे, autoloading अपराधी था। – rybosome

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

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