Перечислите все методы данного класса, исключая методы родительского класса в PHP

Я создаю платформу модульного тестирования для 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 не будет работать).

3 ответов


использовать ReflectionClass, например:

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

можно использовать get_class_methods() без создания экземпляра класса:

$class_name - имя класса или an экземпляр объекта.

таким образом, будет работать следующее:

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

предполагая, что в родительском классе нет повторяющихся методов. И все же ... -Ответ -15-->Лукман-х делает лучшую работу. =)


$class_methods = get_class_methods('Bar');

из документации PHP

Это не экземпляр класса, и позволит вам получить массив всех методов классов.

Я не совсем уверен, что это не вернет методы родительского класса, но get_class_methods будет работать для удаленных классов. Если это так, вы можете использовать ответ Alix для удаления метода родителя из массива. Или Лукман использовать обратный инженерный аспект внутренней базы кода PHP, чтобы получить методы.


кстати, если вы введете в new Bar(), он собирается создать новый экземпляр Foo, так как Bar расширяет Foo. Единственный способ, которым вы не можете создать экземпляр Foo, - это ссылаться на него статически. Поэтому ваша просьба:

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

не имеет возможного решения. Если вы даете new Bar() в качестве аргумента он создаст экземпляр класса.