我有一些代码如下:
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类是在正式命名空间中声明的,但是我想让trait / abstract类转储实际对象的命名空间(a和b)。
如果没有在每个对象中创建此函数并且没有将__NAMESPACE__
作为参数传递给get_ns()
,有没有办法做到这一点?
答案 0 :(得分:6)
答案 1 :(得分:3)
您可以从$this
获取命名空间:
$class = get_class($this);
$ns = substr($class, 0, strrpos($class, '\\'));