如何通过反射在php 5.6中获取属性类命名空间

时间:2017-04-06 14:26:09

标签: php reflection namespaces php-5.6

我想通过ReflectionClass获取类属性的命名空间。

namespace Foo\Bar;
use Foo\Quux\B;

class A{

   /**
   * @var B $b
   */
   protected $b = null;

   ...

}

在另一个类中,我正在创建一个ReflectionClass对象并尝试获取属性b的命名空间,以便我可以为它的类创建ReflectionClass

$namespace = "Foo\\Bar";
$classname = "A";
$rc = new \ReflectionClass("$namespace\\$classname");
$type = getVarType($rc->getProperty("b")->getDocComment()); // returns B
$ns = $rc->getProperty("b")-> ... // I want to find out the namespace of class B
$rc1 = new \ReflectionClass("$ns\\$type");

是否有可能找出A类使用哪些命名空间? 然后,我可以将class A正在使用的名称空间与已发现的属性类型配对。

我知道我可以使用类似这样的类型来解决这个问题:@var Foo\Quux\B $b,但是我有很多类,例如class A,有很多属性和方法使用类型b和我不想重构整个代码。

是否可以从use语句中找到命名空间,或者我必须使用显式类型提示?

谢谢!

2 个答案:

答案 0 :(得分:0)

您应该可以使用getNamespaceName来查找,但getProperty也可以告诉您

namespace Foo;

class A {
    protected $something;
}

namespace Bar;

class B {
    protected $a;

    public function __construct(){
        $this->a = new \Foo\A();
    }
}

$reflection = new \ReflectionClass('Bar\\B');
$a = $reflection->getProperty("a");
var_dump($a);

你会得到

  

对象(ReflectionProperty)#2(2){
  [ “名称”] => string(1)“a”
  [ “类”] => string(5)“Bar \ B”
  }

答案 1 :(得分:0)

一种解决方案是找到声明doc评论中使用的类的use语句。这样就可以从类名中检索完整的命名空间。

您无法直接使用ReflectionClass执行此操作,但this post可能很有趣,或者您可以使用BetterReflection