【问题标题】:Get Namespace of an object using an Abstract Class or Trait?使用抽象类或特征获取对象的命名空间?
【发布时间】:2015-01-28 00:46:10
【问题描述】:

我有一些代码如下:

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()

【问题讨论】:

    标签: php oop namespaces abstract-class traits


    【解决方案1】:

    使用reflection api

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

    这就是它的目的。

    【讨论】:

      【解决方案2】:

      你可以从$this获取命名空间:

      $class = get_class($this);
      $ns = substr($class, 0, strrpos($class, '\\'));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-14
        • 2017-10-25
        • 2013-12-14
        • 2012-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-31
        相关资源
        最近更新 更多