【问题标题】:Why does ReflectionClass::getMethods() returns private methods from parent class?为什么 ReflectionClass::getMethods() 从父类返回私有方法?
【发布时间】:2013-04-05 15:31:55
【问题描述】:

考虑以下 sn-p:

class A {
    private function foo() {}
    protected function bar() {}
}
class B extends A {
    private function baz() {}
}

$r = new ReflectionClass('B');
foreach ($r->getMethods() as $method) {
    echo $method->getName() . PHP_EOL;
}

我希望得到以下输出:

baz
bar

但实际输出是:

baz
foo
bar

为什么getMethods()从父类返回私有方法,因此超出了被反映的类的范围B?

我想知道这背后是否有任何理由,或者这是一个应该提交的错误?

【问题讨论】:

    标签: php reflection


    【解决方案1】:

    不,这不是错误。这个函数完全符合它的设计目的。另外,查看您在问题中提供的链接,有一个filter 参数,可用于设置要返回的方法的属性。

    【讨论】:

    • 我见过filter 参数,但不是过滤器似乎是为我期望该方法返回的内容而设计的。你能解释一下你的推理背后的理由吗? foo() 不在B 的范围内。
    • 另外,我刚刚对ReflectionClass::getProperties() 进行了同样的测试,这个测试按我的预期工作:它返回baz 和bar,但不是foo。
    • @Benjamin 哦,我明白了。抱歉,我第一次没有正确理解问题。
    • @Benjamin 也许您可以通过迭代 getMethods() 结果并检查 ::getModifiers() 和 ::getDeclaringClass() 来实现该行为?
    • 是的,我绝对可以排除私有方法并且其 getDeclaringClass() 返回不同的类名。但如果这是一个 PHP 错误,它仍然需要修复 :)
    猜你喜欢
    • 1970-01-01
    • 2017-09-05
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    相关资源
    最近更新 更多