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

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"。如果我使用抽象 class 而不是特征,则行为是相同的。

这(显然)是因为 trait/abstract class 是在正常命名空间中声明的,但是我希望 trait/abstract class 转储命名空间实际对象(a 和 b)的数量。

有没有办法做到这一点而不在每个对象中创建这个函数并且不将 __NAMESPACE__ 作为参数传递给 get_ns()

您可以从 $this:

获取命名空间
$class = get_class($this);
$ns = substr($class, 0, strrpos($class, '\'));

使用 reflection api:

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

这就是它的用途。