Как правильно получить parent Namespace?

670
.
AlkatraZ
╭∩╮ (`-`) ╭∩╮
Превед всем!

Сегодня что-то потянуло поработать со своим SemanticForm, который у меня уже год, как в состоянии работающего прототипа. Появились новые идеи, переработал и оптимизировал код.
Если эксперимент дойдет до своего конца, то новый генератор форм заменит имеющийся в mobiCMS.
---
Да, но я таки хотел задать знатокам ООП вопрос:
Мне понадобилось динамически обратиться к классам, которые лежат в соседнем подпространстве имен. Чтоб не делать жесской привязки, использовал __NAMESPACE__ которое показывает текущее пространство имен.
Вопрос: как правильно вычислить родительское пространство имен? То есть, в __NAMESPACE__ подняться на один уровень вверх?
Я использовал dirname(__NAMESPACE__)
Хоть данная функция по оф. мануалам и не рассчитана на работу с Namespace (по крайней мере упоминания об этом я не нашел), все работает правильно и родительское пространство имен определяется.

Может есть какой другой кошерный способ?
.
dirname для неймспесов? Мугога. Оно же для этого не предназначено. Руками только.

$classPath = explode("\\", __NAMESPACE__);
array_pop($classPath);
$newClassPath = implode("\\", $classPath) . '\'. 'ClassName';
$object = new $newClassPath();
.
Я использовал dirname(__NAMESPACE__)

Норм вариант. Не раз видел подобное в коде.
.
AlkatraZ
╭∩╮ (`-`) ╭∩╮
# reaper (08.03.2015 / 16:51)
dirname для неймспесов? Мугога. Оно же для этого не предназначено. Руками только.
Я знаю, что в оф. мануалах не сказано.
Но работает отлично.

Ты сравни объем твоего кода и dirname()
.
L!MP
AlkatraZ, dirname() судя по всему вообще работает просто со строкой и никакой завязки на файловой системе не делает.

Правда м.б стоит разворачивать слеши. Т.е менять "\" на "/".
.
╭∩╮ (`-`) ╭∩╮
# L!MP (08.03.2015 / 17:01)
AlkatraZ, dirname() судя по всему вообще работает просто со строкой и никакой завязки на файловой системе не делает.

Правда м.б стоит разворачивать слеши. Т.е менять "\" на "/".
Да, вот это может быть серьезным аргументом.
По идее, у меня щас Винда и dirname() повернет слэши в обратном виде, что совместимо с Namespaces.
А вот если запустить то же самое на Linux, возможно повернет слэши в другую сторону и скрипт перестанет работать.
---
Да фиг с ним, буду указывать в use полный путь, так или иначе там прописаны другие классы, не буду заморачиваться на данной проблеме, ее можно просто не создавать себе гг
---
всем спасибо
.
Ну у меня так не работает:
$ php -r 'namespace One\Two\Three; echo __NAMESPACE__, "\n";'
One\Two\Three
$ php -r 'namespace One\Two\Three; echo dirname(__NAMESPACE__), "\n";'
.

А вот так, да:

$ php -r 'namespace One\Two\Three; echo dirname(str_replace("\\", "/", __NAMESPACE__)), "\n";'
One/Two
.
Конечно маловероятно, но появится платформа, на которой сепаратор не / и не \, а какой-нибудь другой символ, поведение dirname изменится и можно долго потом выяснять, в чём проблема. Поэтому лучше использовать функции только по прямому назначению
.
AlkatraZ, разворачивай слеши как выше в примере и все будет ок. В Ларавел третьей версии такое было при получении имени таблицы из имени класса модели.
.
╭∩╮ (`-`) ╭∩╮
# reaper (08.03.2015 / 17:12)
Конечно маловероятно, но появится платформа, на которой сепаратор не / и не \, а какой-нибудь другой символ, поведение dirname изменится и можно долго потом выяснять, в чём проблема. Поэтому лучше исп
Согласен.
Всего: 22