Перечислите все методы данного класса, исключая методы родительского класса в 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 не будет работать).

10
задан alex 15 January 2012 в 04:18
поделиться

3 ответа

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

$f = new ReflectionClass('Bar');
$methods = array();
foreach ($f->getMethods() as $m) {
    if ($m->class == 'Bar') {
        $methods[] = $m->name;
    }
}
print_r($methods);
27
ответ дан 3 December 2019 в 14:24
поделиться
$class_methods = get_class_methods('Bar');

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

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

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


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

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

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

.
2
ответ дан 3 December 2019 в 14:24
поделиться
[

]Можно использовать []get_class_methods()[] без конкретизации класса:[

] [
] [

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

] [
] [

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

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

]Предположим, что в родительском классе нет повторяющихся методов. Тем не менее, ответ Лукмана [][] работает лучше. =)[

].
5
ответ дан 3 December 2019 в 14:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: