列出给定类的所有方法,不包括PHP中的父类方法

时间:2010-01-06 04:05:05

标签: php oop class methods

我正在为PHP构建一个单元测试框架,我很好奇是否有办法获取排除父类方法的对象列表。所以这个:

class Foo
{

    public function doSomethingFooey()
    {
        echo 'HELLO THERE!';
    }
}

class Bar extends Foo
{
    public function goToTheBar()
    {
        // DRINK!
    }
}

我想要一个函数,给定参数new Bar()返回:

array( 'goToTheBar' );

没有 需要实例化Foo的实例。 (这意味着get_class_methods将不起作用。)

4 个答案:

答案 0 :(得分:27)

使用ReflectionClass,例如:

$f = new ReflectionClass('Bar');
$methods = array();
foreach ($f->getMethods() as $m) {
    if ($m->class == 'Bar') {
        $methods[] = $m->name;
    }
}
print_r($methods);

答案 1 :(得分:5)

您可以在不实例化类的情况下使用get_class_methods()

  

$ class_name - 班级名称​​或   对象实例。

所以以下方法可行:

$bar_methods = array_diff(get_class_methods('Bar'), get_class_methods('Foo'));

假设父类中没有重复的方法。尽管如此,Lukman's answer做得更好。 =)

答案 2 :(得分:2)

$class_methods = get_class_methods('Bar');

From the PHP Documenation

这不会实例化该类,并允许您获取所有类方法的数组。

我不完全确定这不会返回父类方法,但get_class_methods将适用于未实例化的类。如果是,您可以使用Alix的答案从数组中删除父方法。或者Lukman使用PHP内部代码库的逆向工程方面来获取方法。


BTW,如果你输入new Bar(),它将创建一个新的Foo实例,因为Bar扩展了Foo。你无法实例化Foo的唯一方法是静态引用它。因此,您的要求:

I want a function which will, given the parameter new Bar() return:

没有可能的解决方案。如果您将new Bar()作为参数,它将实例化该类。

答案 3 :(得分:0)

对于想知道特定方法是否属于指定类或其父类的任何其他人,您可以通过获取其类名,然后将其与实际类名进行比较来做到这一点,如下所示。

$reflection = new \ReflectionMethod($classInstance, 'method_name_here');
if($reflection->class == MyClass::class)
echo "Method belongs to MyClass";
else
echo "Method belongs to Parent classes of MyClass";