Пространство имен PHP с именем динамического класса
Удивительно, что кто-то еще столкнулся с этой проблемой при использовании новой способности к классам пространства имен с использованием PHP 5.3.
Я генерирую динамический вызов класса, используя отдельный класс для определения типов пользователей в своем приложении. В основном определитель класса принимает целочисленное представление типов и интерпретирует их, возвращая строку, содержащую имя класса, которое будет вызываться как модель для этого пользователя.
У меня есть объектная модель для типа пользователя с этим именем, определенным в глобальной области, но у меня есть другой объект с тем же именем для редактора пользователя в пространстве имен Editor. По какой-то причине PHP не позволит мне сделать динамический вызов с расширением имен следующим образом.
$definition = Definer::defineProfile($_SESSION['user']->UserType);
new \Editor\$definition();
Идентичный синтаксис работает для вызова глобальной базовой объектной модели в глобальном пространстве имен, и я использую его таким образом надёжно во всем приложении.
$definition = Definer::defineProfile($_SESSION['user']->UserType);
new $definition();
Это правильно вызовет динамически желаемый класс.
Есть ли причина, по которой два будут вести себя по-другому или динамический вызов пространств имен, которые еще не были реализованы в этой усадьбе, пока это новая функция? Есть ли другой способ динамического вызова класса из другого пространства имен без явного размещения его имени в коде, но изнутри переменной?
Ответы
Ответ 1
Ну, просто укажите пространство имен в строке:
$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
Ответ 2
$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
}
}