2011-08-11 13 views
12

क्या वर्तमान संदर्भ में, एक PHP फ़ाइल में सभी आयातित कक्षाओं/नामस्थानों की सूची प्राप्त करना संभव है?PHP5: आयातित नेमस्पेस सूची प्राप्त करें

उदाहरण के लिए:

array('B', 'C\D'); 

कारण यह है कि मैं एक मैपर रजिस्ट्री का निर्माण कर रहा हूँ है, और मैं सक्षम होने के लिए करना चाहते हैं:

namespace A; 
use B, C\D; 

मैं इस सरणी प्राप्त करना चाहते हैं वर्तमान संदर्भ में उपनाम वर्ग नाम का उपयोग करके इस मैपर से पूछताछ करने के लिए, और पूरा नाम नहीं।

उदाहरण के लिए:

$registry->getMapper('D'); 

बजाय:

$registry->getMapper('C\D'); 

और यदि संभव हो तो, मैं इन अन्य नामों को हार्डकोड करने, अगर वहाँ एक तरीका है कि उन्हें पीएचपी से स्वचालित रूप से प्राप्त करने के लिए है नहीं चाहते हैं!

उत्तर

5

इस कक्षा और 'getUseStatements' विधि की जांच करें।

https://github.com/doctrine/common/blob/master/lib/Doctrine/Common/Reflection/StaticReflectionParser.php

या इस वर्ग और 'getNamespaceAliases' विधि।

https://github.com/Andrewsville/PHP-Token-Reflection/blob/master/TokenReflection/ReflectionFileNamespace.php

+0

यह लक्ष्य प्राप्त करने के लिए एक उचित तरीका और डॉक्टरेट कॉमन जैसे अच्छी तरह से बनाए रखा लाइब्रेरी से दिखता है। धन्यवाद! – Benjamin

3

इस पर हाल ही में PHP आंतरिक मेलिंग सूची पर चर्चा की गई थी। संक्षिप्त उत्तर (जैसा कि मैं इसे समझता हूं) नहीं है। http://marc.info/?l=php-internals&m=130815747804590&w=2

+0

धन्यवाद, के रूप में Ernesta के जवाब में कहा कि मैं मैं 'उपयोग' मान प्राप्त करने की कोशिश कर रहा हूं। मैं समझता हूं कि यह जानकारी केवल पार्सर के लिए उपयोगी है, लेकिन मैं उम्मीद कर रहा था कि यह जानकारी इंजन को उपलब्ध कराई जा सकती है। – Benjamin

0

अपने मुख्य __construct() पर ऐसा करने का एकमात्र तरीका, नामस्थानों के लिए सभी उपलब्ध PHP फ़ाइलों के लिए कक्षा डीआईआर पढ़ें। (PHP Manual: glob() - Answer 101017)।

+0

धन्यवाद, असल में मैं परिभाषित नामस्थान प्राप्त करने का कोई तरीका नहीं ढूंढ रहा हूं, बल्कि 'उपयोग' कथन प्राप्त करने के लिए। – Benjamin

+0

फिर उसके लिए एक फ़ंक्शन लिखें जिसमें उपयोगकर्ता कॉल करता है और आपका अनुरोध पंजीकृत करता है। –

0

इस प्रश्न के लिए शीर्ष जवाब: is it possible to get list of defined namespaces

कुछ बहुत आसान कोड है जो सभी नामस्थान की गणना कर सकते हैं हैं:,

$namespaces=array(); 
    foreach(get_declared_classes() as $name) { 
     if(preg_match_all("@[^\\\]+(?=\\\)@iU", $name, $matches)) { 
      $matches = $matches[0]; 
      $parent =&$namespaces; 
      while(count($matches)) { 
       $match = array_shift($matches); 
       if(!isset($parent[$match]) && count($matches)) 
        $parent[$match] = array(); 
       $parent =&$parent[$match]; 

      } 
     } 
    } 

    print_r($namespaces); 
+0

यह सभी घोषित कक्षाओं के लिए नामस्थानों की सूची देता है, जबकि सवाल यह है कि * वर्तमान * फ़ाइल में * आयातित * नामित * वापस कैसे करें। बहुत अलग! – Benjamin

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