2010-12-22 77 views
31

想知道是否有人在使用PHP 5.3的名稱空間類的新功能時遇到此問題。帶有Dynamic類名稱的PHP名稱空間

我正在生成一個動態類調用,利用一個單獨的類來定義我的應用程序中的用戶類型。基本上,類定義器接受類型的整數表示並解釋它們,返回一個包含類名的字符串,作爲該用戶的模型。

我有一個用戶類型的對象模型,該名稱在全局範圍中定義了該名稱,但在編輯器名稱空間中,我有另一個具有相同名稱的用戶編輯器的對象。出於某種原因,PHP不允許我按如下方式進行名稱空間動態調用。

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

相同的語法適用於在全局名稱空間中調用全局基本對象模型,並且我在整個應用程序中可靠地使用它。

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

這將正確調用動態所需的類。

是否有兩個行爲不同的原因,或者動態調用命名空間沒有在這個莊園實現,因爲這是一個新的功能?是否有另一種方法可以從另一個名稱空間動態調用一個類,而不必將其名稱顯示在代碼中,而是從一個變量中進行調用?

+0

我會使用eval()作爲 – yoda 2010-12-22 20:25:13

回答

64

那麼,就拼出命名空間中的字符串:

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

如果這是一個孩子的命名空間(如在評論中所示),只需用__NAMESPACE__預先準備的命名空間:

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

因此,如果當前命名空間是\Foo\Bar,並且$definition是「Baz」,則生成的類將是\Foo\Bar\Editor\Baz

+3

完美工作。我沒有想到只是把它附加到字符串上,我得到了一個史詩般的失敗。謝謝! – DeaconDesperado 2010-12-22 20:32:00

-3
$url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : null; 
$url = explode('/', rtrim($url, '/')); 

class Dispatcher { 
    public static function dispatch() { 
     global $url; // 
     if (empty($url[0])) { 
      $url[0] = "Index"; 
      $url[1] = "main"; 
     } 
     $class = '\\Controller\\' .$url[0]; 
     $controller = new $class(); //Index Class 
     $controller->$url[1](); //This Class Main Method 
    } 
} 
相關問題