Получить пространство имен объекта, используя абстрактный класс или черту?

У меня есть код, такой как следующий:

namespace {
trait ns{
public function get_ns(){
var_dump(__NAMESPACE__);
}
}
}

namespace a{
class obj{
use \ns;
}
}

namespace b{
class obj{
use \ns;
}
}

namespace {
$a = new a\obj;
$b = new b\obj;

$a->get_ns();
$b->get_ns();
}

И то и другое $a->get_ns(); а также $b->get_ns(); свалка string(0) "" вместо string(1) "a" а также string(1) "b", Поведение такое же, если я использую абстрактный класс вместо признака.

Это (очевидно), потому что класс trait / abstract был объявлен в пространстве имен nomal, однако я хотел бы, чтобы класс trait / abstract выгружал пространство имен реальных объектов (a и b).

Есть ли способ сделать это без создания этой функции в каждом объекте и без передачи __NAMESPACE__ в качестве аргумента get_ns()?

3

Решение

Использовать отражение API:

var_dump((new \ReflectionObject($this))->getNamespaceName());

Это то, для чего он создан.

6

Другие решения

Вы можете получить пространство имен от $this:

$class = get_class($this);
$ns = substr($class, 0, strrpos($class, '\\'));
3