【问题标题】:List all methods of a given class, excluding parent class's methods in PHP列出给定类的所有方法,不包括 PHP 中父类的方法
【发布时间】:2011-01-01 22:12:22
【问题描述】:

我正在为 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 将不起作用)。

【问题讨论】:

  • 在回复您的 cmets 时,我不是要您实例化 Foo 的新实例,而是要您使用 STATIC 字符串静态访问该类。学习 Scopes Genius...
  • 由于您的回复不可用,我无法验证这一点,但我相信您的陈述类似于“如果您实例化 Bar 将自动实例化 Foo”。问题不是我对范围的了解,问题是您的帖子在静态级别和实例上都提到了一些东西。
  • 我的解决方案是$class_methods = get_class_methods("Bar"); ...它不会实例化任何东西。
  • 我已经为你取消了我的问题。

标签: php oop class methods


【解决方案1】:
$class_methods = get_class_methods('Bar');

From the PHP Documenation

这不会实例化类,并允许您获取所有类方法的数组。

我不完全确定这不会返回父类方法,但get_class_methods 将适用于未实例化的类。如果是这样,您可以使用 Alix 的答案从数组中删除父方法。或者 Lukman 使用 PHP 内部代码库的逆向工程方面来获取方法。


顺便说一句,如果您输入new Bar(),它将创建一个新的 Foo 实例,因为 Bar 扩展了 Foo。无法实例化 Foo 的唯一方法是静态引用它。因此,您的要求:

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

没有可能的解决方案。如果您将new Bar() 作为参数,它将实例化该类。

【讨论】:

  • 哇,伙计 .. 现在我为不阅读手册而将高级软件开发人员叫出来感到难过......我会克服它......
  • 首先,我想指出的是,这实际上并不能回答问题,而且很聪明。
  • 接下来,我想建议您考虑一下我不希望将 Foo 实例化为单独实例的充分理由。一个例子可能是 Foo 是一个单例,这意味着你不能同时实例化 Foo 和 Bar。
  • 最后,为什么当你的声明“我不完全确定这不会返回父类方法”时关于阅读手册的讽刺评论是一个明确的声明,你犯了同样的错误?住在玻璃屋里的人不应该扔石头……
  • 最后,我删除了您可能被冒犯的所有讽刺言论。但是,我和 Alix 的回答都表明您犯了一个错误,认为 get_class_methods 无法处理此任务。
【解决方案2】:

使用ReflectionClass,例如:

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

【讨论】:

  • 只是为了扩展这个答案,我需要阅读应用程序尚未加载的方法。我能够运行 include('path/to/class.php'); $f = new ReflectionClass('Class');这是一个很好的解决方案。谢谢!
  • 稍微对称一点:if ($m->class == $f->name)
【解决方案3】:

你可以使用get_class_methods()而不实例化类:

$class_name - 类名 对象实例。

所以下面的方法会起作用:

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

假设父类中没有重复的方法。不过,Lukman's answer 做得更好。 =)

【讨论】:

  • 我更喜欢这个答案。我想获取当前类的所有方法,不包括父类。虽然这不是 OP 所要求的,但它可能对某人有所帮助:array_diff(get_class_methods(__CLASS__),get_class_methods(get_parent_class()))
【解决方案4】:

对于其他想知道如何检查特定方法是否属于指定类或其父类的人,您可以通过获取其类名然后将其与实际类名进行比较来做到这一点,如下所示。

$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";

【讨论】:

    猜你喜欢
    • 2020-04-21
    • 1970-01-01
    • 2016-03-25
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多