У меня есть код, такой как следующий:
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()
?
Использовать отражение API:
var_dump((new \ReflectionObject($this))->getNamespaceName());
Это то, для чего он создан.
Вы можете получить пространство имен от $this
:
$class = get_class($this);
$ns = substr($class, 0, strrpos($class, '\\'));