使用抽象类或特征获取对象的命名空间


Get Namespace of an object using an Abstract Class or Trait?

我有一些代码

,如下所示:
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, ''''));