Перечислите все методы данного класса, кроме методов родительского класса в PHP - PullRequest
10 голосов
/ 06 января 2010

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

27 голосов
/ 06 января 2010

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

$f = new ReflectionClass('Bar');
$methods = array();
foreach ($f->getMethods() as $m) {
    if ($m->class == 'Bar') {
        $methods[] = $m->name;
    }
}
print_r($methods);
5 голосов
/ 06 января 2010

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

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

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

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

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

2 голосов
/ 06 января 2010
$class_methods = get_class_methods('Bar');

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

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

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


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

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

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

0 голосов
/ 14 января 2019

Для всех, кто интересуется, как проверить, принадлежит ли конкретный метод указанному классу или его родительскому классу, вы можете сделать это, получив его имя класса, а затем сравнив его с фактическим именем класса, как показано ниже.

$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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...