2012-02-27 3 views
3

ReflectionMethod documentationでは、メソッドがその親クラスから継承されたか、反映されたクラスで定義されたメソッドを知ることができません。PHP Reflection:ReflectionMethodが継承されているかどうかを確認する方法

編集:私はReflectionClass::getMethods()を使用します。私は、各メソッドが、反映されているクラスで定義されているか、または親クラスで定義されているかどうかを知りたいです。最後に、現在のクラスで定義されているメソッドだけを残したいと思います。

class Foo { 
    function a() {} 
    function b() {} 
} 

class Bar extends Foo { 
    function a() {} 
    function c() {} 
} 

私はacを維持したいです。

+3

あなたが達成しようとしていることは何ですか? –

+0

メソッドが親クラスから継承されているか、またはクラスが「反映されている」(つまり継承されていない)クラスで定義されているかどうかを知りたい。あなたが正確に理解できないことは何ですか? –

+1

@Matthieu:あなたはそれをやりたいと思う必要があります - その理由は何ですか(あなたの最終目標)?私はリフレクションAPIに慣れていませんが、親クラスでしか定義されていないメソッドにもアクセスできますか? –

答えて

5

メソッドを宣言するクラスを取得するには、ReflectionMethod::getDeclaringClass()を呼び出すことができます。親クラスを取得するためにReflectionClass::getParentClass()への呼び出し。最後にReflectionClass::hasMethod()を呼び出すと、メソッドが親クラスで宣言されたかどうかがわかります。

例:

<?php 
class Foo { 
    function abc() {} 
} 

class Bar extends Foo { 
    function abc() {} 
    function def() {} 
} 


$bar = new Bar(); 

$meth = new ReflectionMethod($bar, "abc"); 
$cls = $meth->getDeclaringClass(); 
$prnt = $cls->getParentClass(); 

if ($cls->hasMethod($meth->name)) { 
    echo "Method {$meth->name} in Bar\n"; 
} 
if ($prnt->hasMethod($meth->name)) { 
    echo "Method {$meth->name} in Foo\n"; 
} 

$meth = new ReflectionMethod($bar, "def"); 
$cls = $meth->getDeclaringClass(); 
$prnt = $cls->getParentClass(); 

if ($cls->hasMethod($meth->name)) { 
    echo "Method {$meth->name} in Bar\n"; 
} 
if ($prnt->hasMethod($meth->name)) { 
    echo "Method {$meth->name} in Foo\n"; 
} 
+0

OK私はあなたがやっていることを見ていますが、 'abc'の場合、それは親クラスにありますが、' Bar'で定義されているかどうかわかりません(継承されているか、 )。私は 'Foo'のメソッドだけを残したいと思います。 –

+0

メソッドが 'Bar'にあるかどうかをチェックする方法を示すようにサンプルを更新しました。 if文の組み合わせを使用して、探している結果を得ることができるはずです。 – MitMaro

+0

それはそれが良い作品です、ありがとう! –

4

はあなたが興味のあるメソッドのReflectionMethodオブジェクトを取得した後、親クラスのメソッドのReflectionMethodを取得するためにgetPrototype()を使用することができます。メソッドが親のメソッドをオーバーライドしない場合は、ReflectionClass例外がスローされます。

次のコード例は、メソッド名がキーである配列と、リフレクションされたクラスで使用されている実装を定義したクラスを作成します。

class Base { 
    function basemethod() {} 
    function overridein2() {} 
    function overridein3() {} 
} 
class Base2 extends Base { 
    function overridein2() {} 
    function in2only() {} 
    function in2overridein3() {} 
} 
class Base3 extends Base2 { 
    function overridein3() {} 
    function in2overridein3() {} 
    function in3only() {} 
} 

$rc = new ReflectionClass('Base3'); 
$methods = array(); 
foreach ($rc->getMethods() as $m) { 
    try { 
     if ($m->getPrototype()) { 
      $methods[$m->name] = $m->getPrototype()->class; 
     } 
    } catch (ReflectionException $e) { 
     $methods[$m->name] = $m->class; 
    } 
} 

print_r($methods); 

これが印刷されます:

Array 
(
    [overridein3] => Base 
    [in2overridein3] => Base2 
    [in3only] => Base3 
    [overridein2] => Base 
    [in2only] => Base2 
    [basemethod] => Base 
) 
関連する問題