2010-12-22 52 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 
    } 
} 
相关问题