我正在为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
将不起作用。)
答案 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');
这不会实例化该类,并允许您获取所有类方法的数组。
我不完全确定这不会返回父类方法,但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";