Пространство имен PHP с именем динамического класса

Удивление, если кто-то еще столкнулся с этой проблемой при использовании новой возможности классов пространства имен с использованием PHP 5.3.

Я генерирую динамический вызов класса, используя отдельный класс для определения типов пользователей в своем приложении. В основном определитель класса принимает целочисленное представление типов и интерпретирует их, возвращая строку, содержащую имя класса, которое будет вызываться как модель для этого пользователя.

У меня есть объектная модель для типа пользователя с этим именем, определенным в глобальной области, но у меня есть другой объект с тем же именем для редактора пользователя в пространстве имен Editor. По какой-то причине PHP не позволит мне сделать динамический вызов с расширением имен следующим образом.

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

Идентичный синтаксис работает для вызова глобальной базовой объектной модели в глобальном пространстве имен, и я использую ее таким образом надёжно во всем приложении.

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

Это правильно вызовет динамически желаемый класс.

Есть ли причина, по которой они будут вести себя по-другому или динамический вызов пространств имен, которые еще не были реализованы в этой усадьбе, но это новая функция? Есть ли другой способ динамического вызова класса из другого пространства имен без явного размещения его имени в коде, но изнутри переменной?

Ну, просто укажите пространство имен в строке:

 $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

 $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 } }