Принятие у меня есть следующие классы в различных файлах:
<?php
namespace MyNS;
class superclass {
public function getNamespace(){
return __NAMESPACE__;
}
}
?>
<?php
namespace MyNS\SubNS;
class childclass extends superclass { }
?>
Если я инстанцирую "childclass" и называю getNamespace (), он возвращает "MyNS".
Там какой-либо путь состоит в том, чтобы получить текущее пространство имен от дочернего класса, не повторно объявляя метод?
Я обратился к созданию статической переменной $namespace в каждом классе и ссылке на него использование super::$namespace
но это просто не чувствует себя очень изящным.
__NAMESPACE__
- это константа времени компиляции, то есть она полезна только во время компиляции. Его можно представить как макрос, который при вставке заменяет себя текущим пространством имен. Следовательно, не существует способа заставить __NAMESPACE__
в суперклассе ссылаться на пространство имен дочернего класса. Вам придется прибегнуть к некоторой переменной, которая присваивается в каждом дочернем классе, как вы уже делаете.
В качестве альтернативы, вы можете использовать отражение для получения имени пространства имен класса:
$reflector = new ReflectionClass('A\\Foo'); // class Foo of namespace A
var_dump($reflector->getNamespaceName());
Смотрите руководство по PHP для получения дополнительной (незаконченной) документации. Обратите внимание, что для использования отражения вам потребуется PHP 5.3.0 или более поздняя версия.
Вы также можете сделать это в методе getNamespace():
return get_class($this);
При вызове из childclass результат будет таким:
MyNS\SubNS\childclass
Если вам не нужно имя класса в конце, просто отрежьте все от последнего \ до конца.