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

Принятие у меня есть следующие классы в различных файлах:

<?php
    namespace MyNS;

    class superclass {

        public function getNamespace(){
            return __NAMESPACE__;
        }
    }
?>

<?php
    namespace MyNS\SubNS;

    class childclass extends superclass { }
?>

Если я инстанцирую "childclass" и называю getNamespace (), он возвращает "MyNS".

Там какой-либо путь состоит в том, чтобы получить текущее пространство имен от дочернего класса, не повторно объявляя метод?

Я обратился к созданию статической переменной $namespace в каждом классе и ссылке на него использование super::$namespace но это просто не чувствует себя очень изящным.

30
задан hakre 18 April 2013 в 15:09
поделиться

2 ответа

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

В качестве альтернативы, вы можете использовать отражение для получения имени пространства имен класса:

$reflector = new ReflectionClass('A\\Foo'); // class Foo of namespace A
var_dump($reflector->getNamespaceName());

Смотрите руководство по PHP для получения дополнительной (незаконченной) документации. Обратите внимание, что для использования отражения вам потребуется PHP 5.3.0 или более поздняя версия.

21
ответ дан 28 November 2019 в 00:09
поделиться

Вы также можете сделать это в методе getNamespace():

return get_class($this);

При вызове из childclass результат будет таким:

MyNS\SubNS\childclass

Если вам не нужно имя класса в конце, просто отрежьте все от последнего \ до конца.

13
ответ дан 28 November 2019 в 00:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: