2012-02-27 57 views
3

ReflectionMethod documentation中,我找不到任何知道它的方法是从它的父类继承还是在反射类中定义的。我使用ReflectionClass::getMethods()。我想知道每种方法是否已经在类中定义了它,或者它是否已经在父类中定义。最后,我只想保留当前类中定义的方法。PHP反射:如何知道ReflectionMethod是否被继承?

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

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

我想保持ac

+3

什么是你想达到什么目的? – 2012-02-27 20:37:31

+0

我想知道一个方法是从父类继承还是在“反映”类中定义(即没有继承)。你不明白的是什么? – 2012-02-27 20:43:58

+1

@Matthieu:你必须要这样做 - 有一个原因 - 你的最终目标是什么?我不太熟悉Reflection API,但是你甚至能够访问只在父类中定义的方法吗? – 2012-02-27 20:45:00

回答

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

好的,我明白你在做什么,但是在'abc'的情况下,我会知道它在父类中,但是我不知道它是否在'Bar'中定义(继承或者覆盖没有区别)。我只想保留'Foo'的方法。 – 2012-02-27 20:51:50

+0

我更新了示例以展示如何检查方法是否在'Bar'中。您应该能够使用if语句的组合来获得您正在查找的结果。 – MitMaro 2012-02-27 20:55:56

+0

这是一个很好的作品,谢谢! – 2012-02-27 21:03:12

4

你可以得到你所感兴趣的方法ReflectionMethod对象,然后用getPrototype()得到父类的方法ReflectionMethod。如果该方法不覆盖父级中的方法,则会抛出异常。

下面的示例代码将创建一个数组,其中包含方法名称作为键以及定义用于反射类的实现的类。

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 
) 
相关问题