我有一些代码
,如下所示: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, ''''));