2017-04-06 4 views
2

ReflectionClassを使用してクラスプロパティの名前空間を取得したいとします。リフレクションを介してPHP 5.6でプロパティクラスの名前空間を取得する方法

別のクラスにおいて
namespace Foo\Bar; 
use Foo\Quux\B; 

class A{ 

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

    ... 

} 

私はReflectionClassオブジェクトを作成し、私はそれのクラスのReflectionClassを作成することができますプロパティbの名前空間を取得しようとしています。

$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、私はbのようなタイプを使用して多くのプロパティとメソッドを持つclass Aのような多くのクラスを持っていると私は全体のコードをリファクタリングする必要はありません。

useステートメントからネームスペースを見つけることは可能ですか、または明示的なタイプヒントを使用する必要がありますか?

ありがとうございます!

答えて

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) {
[ "名前"] =>列(1) ""
[ "クラス"] =>列(5) "バー\ B"
}

+0

ありがとうございますが、これは私が望む結果ではありません。 返されたクラスを 'Foo \ A'としたいので、再帰的にそれを調べることができます。 new \ ReflectionClass( "Foo \\ A"); ' –

+0

を作成します。返されたクラスの' str_replace'を返すと、あなたは何を記述しているのか正確に行うことができます – Machavity

+0

事は、または最初に期待する名前空間。あなたのコード例の 'B'クラスは' $ c'というプロパティを持っていて、 'Foobar \ C'や' Bar \ C'のようなクラスです。私は本当にPHPが本当のクラスを発見できるのかどうかは分かりません。そうでなければ完全な名前空間が書かれるDocCommentを調べます。 –

0

解決策の1つは、ドキュメントコメントで使用されるクラスを宣言するuseステートメントを見つけることです。これにより、クラス名から完全な名前空間を取得することが可能になります。

ReflectionClassを使用して直接行うことはできませんが、this postは面白いかもしれません。またはBetterReflectionを使用してください。

関連する問題