2011-08-11 63 views
12

是否可以在當前上下文中獲取PHP文件中所有導入的類/名稱空間的列表?PHP5:獲取導入的命名空間列表

例如:

namespace A; 
use B, C\D; 

我想獲得這個數組:

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

的原因是,我建立一個映射註冊表,我希望能夠在當前上下文中使用別名類名查詢此映射器,而不是全名。

例如:

$registry->getMapper('D'); 

相反的:

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

如果可能的話,我想沒有硬編碼這些別名,如果有一種方法從PHP自動獲得他們!

回答

3

這是最近在PHP Internals郵件列表中討論的。簡短的回答(據我所知)是不。 http://marc.info/?l=php-internals&m=130815747804590&w=2

+0

謝謝你,在Ernesta的回答說,我試圖獲得「使用」值。我知道這些信息可能只對解析器有用,但我希望這些信息可以提供給引擎。 – Benjamin

0

要做到這一點,在您的主__construct()上,讀取類dir,爲名稱空間提供所有可用的php文件。 (PHP Manual: glob() - Answer 101017)。

+0

謝謝,實際上我不是在尋找一種獲得定義的命名空間的方式,而是爲了獲得'use'語句。 – 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

這將返回所有聲明類的名稱空間列表,而問題是如何返回* current *文件中的* imported *名稱空間。非常不一樣! – Benjamin