Пространство имен PHP с динамическим именем класса - PullRequest
35 голосов
/ 22 декабря 2010

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

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

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

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

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

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

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

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

1 Ответ

72 голосов
/ 22 декабря 2010

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

$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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...