我想通过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
语句中找到命名空间,或者我必须使用显式类型提示?
谢谢!
答案 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。