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
ステートメントからネームスペースを見つけることは可能ですか、または明示的なタイプヒントを使用する必要がありますか?
ありがとうございます!
ありがとうございますが、これは私が望む結果ではありません。 返されたクラスを 'Foo \ A'としたいので、再帰的にそれを調べることができます。 new \ ReflectionClass( "Foo \\ A"); ' –
を作成します。返されたクラスの' str_replace'を返すと、あなたは何を記述しているのか正確に行うことができます – Machavity
事は、または最初に期待する名前空間。あなたのコード例の 'B'クラスは' $ c'というプロパティを持っていて、 'Foobar \ C'や' Bar \ C'のようなクラスです。私は本当にPHPが本当のクラスを発見できるのかどうかは分かりません。そうでなければ完全な名前空間が書かれるDocCommentを調べます。 –