Я создаю платформу поблочного тестирования для 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
не будет работать).
Используйте, например, ReflectionClass:
$f = new ReflectionClass('Bar');
$methods = array();
foreach ($f->getMethods() as $m) {
if ($m->class == 'Bar') {
$methods[] = $m->name;
}
}
print_r($methods);
$class_methods = get_class_methods('Bar');
Это не будет инстанцировать класс, а позволит получить массив всех методов классов.
Я не совсем уверен, что это не вернет методы родительского класса, но 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()
в качестве аргумента, то это будет инстанцировать класс.
]Можно использовать []get_class_methods()[
] без конкретизации класса:[
] [] [][]$class_name[] - Имя класса []или[] a экземпляр объекта.[
] [
]Таким образом, сработает следующее:[
] [$bar_methods = array_diff(get_class_methods('Bar'), get_class_methods('Foo'));
]
[]Предположим, что в родительском классе нет повторяющихся методов. Тем не менее, ответ Лукмана [][] работает лучше. =)[
].